转载(关于String类的线程安全)
看下面String类的一段代码:
public class String {
private final char value[];
/** Cache the hash code for the string */
private int hash;
// Default to 0
public String(char[] value) {
this.value = https://www.it610.com/article/Arrays.copyOf(value, value.length);
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0;
i < value.length;
i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
}
String是不可变的,但是我们发现hashCode发现在改变了内部状态值int hash;看其实现可以总结,不可变可以改变其内部状态,只要这种改变不要对外暴露。
我们重写一下hasCode代码如下:
public int hashCode() {
if (hash == 0 && value.length > 0) {
char val[] = value;
for (int i = 0;
i < value.length;
i++) {
hash = 31 * hash + val[i];
}
}
return hash;
}
这时就是线程不安全了,我们移走了本地变量h,直接基于内部状态进行改变操作。如果同时有几个线程调用这个方法,返回的值可能是不同的。
【转载(关于String类的线程安全)】来源:不可变真的意味线程安全? -解道Jdon
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想
- 关于读书的思考
- 关于this的一些问题(1)
- 《声之形》
- 关于如何沟通的1/2/3