查看Java的String类,我们可以看到哈希代码在第一次评估后被缓存.
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;
}
Run Code Online (Sandbox Code Playgroud)
hash实例变量在哪里.我有一个问题,为什么我们需要h额外的变量?
仅仅因为hash循环中的值更改和没有中间临时变量的解决方案不是线程安全的.考虑在多个线程中调用此方法.
说thread-1开始hash计算,它0不再是.稍后一些小的时刻会thread-2在同hashCode()一个对象上调用相同的方法,但是看hash不到0,但thread-1还没有完成计算.结果,将使用thread-2错误的hash(未完全计算的)值.
这是一种简单且廉价的同步机制。
如果一个线程第一次调用 hashCode() ,并且在第一个线程计算哈希值时第二个线程再次调用它,则如果直接使用,第二个线程将返回错误的哈希值(第一个线程中计算的中间值)属性。
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |