JUC_3-ConcurrentHashMap 锁分段机制

ConcurrentHashMap 锁分段机制

 

JUC_3-ConcurrentHashMap 锁分段机制

 

引入:Hashmap线程不安全,而Hashtable线程安全,但效率底,为什么效率低在于。

 

JUC_3-ConcurrentHashMap 锁分段机制

 

    对Hashtable使用Lock锁对整个表锁住,当多个线程去访问Hashtable表时,并行操作转换成串行操作,一次只有一个线程对Hashtable进行操作,一个线程把表访问完以后,下个线程才进来访问。同时也存在“复合操作”比如若存在则删除,若不存在则删除。

 

ConcurrentHashMap采用“锁分段”机制

JUC_3-ConcurrentHashMap 锁分段机制

     ConcurrentLevel 分段的级别默认是16个段(segment),每一个段中有独立的HashMap表,每个HashMap表的元素又是一个LinkList链表。

     16个段,每个段形成了独立的哈希表,每个分段都有独立的锁,当多个线程去访问ConcurrentHashMap时,每个线程就可以并行的区访问表,支持多个线程同时访问,不仅线程安全而且效率也高

    Collection工具类转化为 synchronizedMap转换为线程安全的。

    JDK1.8将ConcurrentHashMap升级了,分段锁几乎取消了ConcurrentHashMap底层大量使用CAS算法,CAS算法理解为无锁算法无涉及到阻塞。

 

其它的java.uitl.Collections的工具包下:

    当期望许多线程访问一个给定 collection 时, ConcurrentHashMap 通常优于同步的 HashMap,

                                                                         ConcurrentSkipListMap 通常优于同步的 TreeMap。

  当期望的读数和遍历远远大于列表的更新数时, CopyOnWriteArrayList 优于同步的 ArrayList。

 

    JUC_3-ConcurrentHashMap 锁分段机制