当前位置:  开发笔记 > 编程语言 > 正文

Java的"String"哈希码函数是否是线程安全的,如果它的缓存设置器不使用锁?

如何解决《Java的"String"哈希码函数是否是线程安全的,如果它的缓存设置器不使用锁?》经验,为你挑选了1个好方法。

这是来自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并以其他方式设置它.构造函数并不总是设置此值(以及为什么还要检查当然).

因此,虽然在实际应用中很难再现,但看起来这个哈希上的竞争条件似乎正确吗?

我的意思是,一旦你把它放在一个hashmap中,它就会安全,除非你先把它发送到另一个线程.但是如果字符串在两个线程上并同时添加到散列映射中,则hashMap函数可以采用部分写入的"散列"值并返回它.



1> Amit..:

从理论上讲,可以生成一些代码,这些代码会导致多个同时线程读取0值哈希并进入计算部分.这将是"浪费",但是安全,因为函数对不可变字符进行操作,并且每个实例将计算完全相同的散列值.


@ user1122069:java中的整数访问保证是原子的.龙不是.
推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有