转载(关于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

    推荐阅读