JUC_3-ConcurrentHashMap 锁分段机制
ConcurrentHashMap 锁分段机制
引入:Hashmap线程不安全,而Hashtable线程安全,但效率底,为什么效率低在于。
对Hashtable使用Lock锁对整个表锁住,当多个线程去访问Hashtable表时,并行操作转换成串行操作,一次只有一个线程对Hashtable进行操作,一个线程把表访问完以后,下个线程才进来访问。同时也存在“复合操作”比如若存在则删除,若不存在则删除。
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。