gpt4 book ai didi

java - 如果 Java 的 "String"哈希码函数的缓存 setter 不使用锁,它是线程安全的吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:32:05 32 4
gpt4 key购买 nike

这是 Java 的 String hashCode 函数的代码

    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;
}

如您所见,它检查散列 ("private int hash") == 0 是否为 0,否则设置它。构造函数并不总是设置此值(当然还有为什么要检查)。

因此,虽然在实际使用中很难重现,但看起来这个哈希值可能存在竞争条件,对吧?

我的意思是,例如,一旦您将它放入 HashMap 中,它将是安全的,除非您首先将它发送到另一个线程。但是,如果字符串在两个线程上并同时添加到 HashMap 中,则 hashMap 函数可以获取部分写入的“哈希”值并将其返回。

最佳答案

理论上,可以生成代码,使多个同时线程读取 0 值哈希并进入计算部分。这将是“浪费”,但安全,因为该函数对不可变字符进行操作,并且每个实例都会计算完全相同的哈希值。

关于java - 如果 Java 的 "String"哈希码函数的缓存 setter 不使用锁,它是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704185/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com