hashmap线程不安全的原因

转载 2018年04月15日 11:13:06

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

hashMap线程不安全的原因及表现

hashMap出现线程不安全的原因: HashMap的实现里没有锁的机制,因此它是线程不安全的。其实只要有锁的机制,可以通过锁实现线程安全,我们在读写HashMap对象的时候加锁,以保障这个对象的线...
  • VIP_WangSai
  • VIP_WangSai
  • 2017-04-15 10:59:23
  • 3128

浅谈Java8的HashMap为什么线程不安全

PS:本文使用的Java源码是JDK1.8。 事情起因很简单,起源于类似you can,you up的玩笑。我这人喜欢较真,尤其是遇见我会的问题的时候。 我们先上一组代码。 public...
  • LovePluto
  • LovePluto
  • 2018-03-27 16:21:52
  • 206

HashMap为什么线程不安全以及解决方法

众所周知,hashmap线程不安全而hashtable线程安全。最近在看并发编程就稍微研究了一下。先看一段JAVAAPI中对hashmap的介绍:*注意,此实现不是同步的。如果多个线程同时访问此映射,...
  • Yixiong_Cao
  • Yixiong_Cao
  • 2015-12-10 19:26:30
  • 5190

HashMap多线程不安全

事故分析最近一次web工程上线,上线大概半个小时,出现了报警,16核的服务器的cpu使用了1123%,程序出异常了。 Cpu利用率过高一般是因为出现了出现了死循环,导致部分线程一直运行。占用cpu时...
  • u012973218
  • u012973218
  • 2017-05-11 10:26:42
  • 316

证明HashMap是线程不安全的

在平时开发中,我们经常采用HashMap来作为本地缓存的一种实现方式,将一些如系统变量等数据量比较少的参数保存在HashMap中,并将其作为单例类的一个属性。在系统运行中,使用到这些缓存数据,都可以直...
  • qq991029781
  • qq991029781
  • 2016-03-19 11:34:43
  • 2759

HashMap线程不安全在哪里

线程不安全如果多个线程同时访问这个Map,而且至少一个线程对Map进行结构性的修改(增加,删除操作,update不算),那么它必须在外部进行同步。比如一个线程对HashMap进行扩容,另外一个线程读取...
  • zly9923218
  • zly9923218
  • 2016-05-25 12:42:05
  • 2733

HashMap为什么线程不安全?浅析高并发情况下的HashMap

1.Hashmap在插入元素过多的时候需要进行Resize; 2.Hashmap扩容时Resize的ReHash步骤,并发的情况下可能会形成链表环;...
  • V_Axis
  • V_Axis
  • 2017-11-22 16:50:18
  • 1887

HashMap为什么线程不安全

一直以来都知道HashMap是线程不安全的,但是到底为什么线程不安全,在多线程操作情况下什么时候线程不安全? 让我们先来了解一下HashMap的底层存储结构,HashMap底层是一个Entry数组,...
  • A_lele123
  • A_lele123
  • 2015-08-14 15:02:22
  • 3296

7.多线程下put和get操作导致的HashMap线程不安全问题

谈谈HashMap线程不安全的体现HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了。那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什...
  • u014590757
  • u014590757
  • 2018-03-10 16:34:31
  • 15

hashmap线程不安全在哪里?

hashmap线程不安全在哪里? 博客分类: j2sejava 大家都知道HashMap不是线程安全的,但是大家的理解可能都不是十分准确。很显然读写同一个key会...
  • jiafu1115
  • jiafu1115
  • 2012-05-16 22:32:42
  • 6147
收藏助手
不良信息举报
您举报文章:hashmap线程不安全的原因
举报原因:
原因补充:

(最多只允许输入30个字)