A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

HashMap
在JDK1.7中,hashmap的结构是数组加链表, Entry数组+ Entry中包含key-value,next指向链表中下一个Entry。在多线程环境下,hashmap是线程不安全的.
在JDK1.8中,hashmap加入了红黑树,当链表长度大于8时,后面的数据都放在红黑树中,优化了性能.

HashTable
hashtable原理和hashmap基本一样,两者区别在于hashmap允许key-value为null值,hashtable不行,hashmap是线程不安全的,而hashtable的方法基本都加了synchronized,hashtable是线程安全的,从性能上来说,因为hashmap是线程不安全的,性能上会比线程安全的hashtable要快.

ConcurrentHashMap
在java1.7中,concurrenthashmap的数据结构为 Segment + HashEntry,ConcurrentHashMap的锁分段技术:假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术。首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。用一个Segment数组维护所有的键值对,一个Segment对象的数据结构相当于一个HashMap,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentrantLock)。ConcurrentHashMap中的HashEntry相对于HashMap中的Entry有一定的差异性:HashEntry中的value以及next都被volatile修饰,这样在多线程读写过程中能够保持它们的可见性.
在java1.8中,它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法。它沿用了与它同时期的HashMap版本的思想,底层依然由“数组”+链表+红黑树的方式思想,接采用transient volatile Node<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。
并且,ConcurrentHashMap相对于HashTable来说,ConcurrentHashMap的很多操作比如get,clear,iterator 都是弱一致性的,而HashTable是强一致性的。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马