HashMap实现原理(二)——多线程问题
2018-04-04 18:30
316 查看
本文的分析是基于jdk1.7源码
前奏:我们都知道,HashMap的初始容量是16,当HashMap中的值的size超过threshold时,会进行扩容操作;扩容会执行resize—>transfer方法
HashMap之所以线程不安全就是因为在resize(transfer)的时候会不安全。
resize(transfer)会执行如下操作,并将原hash表中的内容移动到新的hash表中。
上代码:
代码解释:
1. 对索引数组中的元素遍历
2. 对链表上的每一个节点遍历:用next取得要转移那个元素的下一个,将e转移到新Hash表的头部,使用头插法插入节点
3. 循环2,直到链表节点全部转移
4. 循环1,知道所有索引数组全部转移
多线程举例:
现有old table表,其中hash表的size=2,key=3,7,5. 假设hash算法是key mod table.length; 则碰撞发生在table[1]。现在扩容将hash表resize到4,。
如图:
现在有两个线程 1和2。同时进行了put操作,并进入了transfer函数。并且线程1在如下处挂起。而线程2继续执行完。
现在的状态为:
线程2执行完后,线程1被唤醒。
执行e.next = newTable[i], 于是key(3)的next指向了线程1的新Hash表,因为新Hash表为空,所以e.next = null
执行newTable[i] = e,所以线程1的新Hash表第一个元素指向了线程2新Hash表的key(3)
执行e = next,将e指向next, 所以新的e是key(7)
然后
1、现在的e结点是key(7),首先执行Entry
前奏:我们都知道,HashMap的初始容量是16,当HashMap中的值的size超过threshold时,会进行扩容操作;扩容会执行resize—>transfer方法
HashMap之所以线程不安全就是因为在resize(transfer)的时候会不安全。
resize(transfer)会执行如下操作,并将原hash表中的内容移动到新的hash表中。
上代码:
代码解释:
1. 对索引数组中的元素遍历
2. 对链表上的每一个节点遍历:用next取得要转移那个元素的下一个,将e转移到新Hash表的头部,使用头插法插入节点
3. 循环2,直到链表节点全部转移
4. 循环1,知道所有索引数组全部转移
多线程举例:
现有old table表,其中hash表的size=2,key=3,7,5. 假设hash算法是key mod table.length; 则碰撞发生在table[1]。现在扩容将hash表resize到4,。
如图:
现在有两个线程 1和2。同时进行了put操作,并进入了transfer函数。并且线程1在如下处挂起。而线程2继续执行完。
for (Entry<K,V> e : table) { while(null != e) { Entry<K,V> next = e.next;// 线程1在此处被挂起 if (rehash) { e.hash = null == e.key ? 0 : hash(e.key); } int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } }
现在的状态为:
线程2执行完后,线程1被唤醒。
执行e.next = newTable[i], 于是key(3)的next指向了线程1的新Hash表,因为新Hash表为空,所以e.next = null
执行newTable[i] = e,所以线程1的新Hash表第一个元素指向了线程2新Hash表的key(3)
执行e = next,将e指向next, 所以新的e是key(7)
然后
1、现在的e结点是key(7),首先执行Entry
相关文章推荐
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- Hashtable、HashMap、ConcurrentHashMap 底层实现原理与线程安全问题
- HashMap、Hashtable和ConcurrentHashMap底层实现原理和线程安全问题
- hashmap底层实现原理以及常见的面试问题
- Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- java多线程之ConcurrentHashMap实现原理
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- Java集合---ConcurrentHashMap原理分析(面试问题:ConcurrentHashMap实现原理是怎么样的)
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- Hashtable、HashMap、ConcurrentHashMap底层实现原理与线程安全问题
- HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- Hashtable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题
- HashMap实现原理分析(面试问题:两个hashcode相同 的对象怎么存入hashmap的)
- PHP session的实现原理 大网站应用应注意的问题
- 多线程典型问题实现总结
- Java HashMap实现原理