hashmap线程不安全的原因

hashmap线程安全问题

-在单线程情况下,由于不存在另外一个进程去读取程序,故而不可能发生代码在逻辑上的判定失常;多线程则体现在以下2个方面

  1. 当进行扩容操作的时候,会执行如下代码
void transfer(Entry[] newTable) {
        Entry[] src = table;
        int newCapacity = newTable.length;
        for (int j = 0; j < src.length; j++) {
            Entry<K,V> e = src[j];
            if (e != null) {
                src[j] = null;
                do {
            q:        Entry<K,V> next = e.next;
                    int i = indexFor(e.hash, newCapacity);
                    e.next = newTable[i];
                    newTable[i] = e;
                    e = next;
                } while (e != null);
            }
        }
    }

在整个时候由于代码执行到标记q处,就被cpu夺取了执行权,而别的线程在此情况下,执行完全部的代码之后;原来的线程会从q处依旧继续执行下去,导致hashmap桶中的最后一个元素又插入到头结点,使得该节点又指向‘指向他的节点从而形成死循环’

2、上述是发生在扩容,如下发生在多线程put操作

第一种情况是发生在扩容时候的开始节点,而多线put操作导致线程安全是在原本链表的后端部分

当处在不同桶中的元素的next是null的时候,会导致原本另外一个线程,在原本的链表中找不到后续的节点,而错判需要put的元素已经全部完成,导致的后面不同桶中的元素的丢失

参考:https://www.cnblogs.com/dongguacai/p/5599100.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值