失效链接处理 |
jdk中线程安全的集合类 PDF 下载
本站整理下载:
相关截图:
![]()
主要内容:
Jdk中线程安全的集合类汇总学习
ConcurrentHashMap原理
ConcurrentHashMap是线程安全且高效的HashMap集合。在工作环境中并发与多线程是难免的,这时候类似HashMap这样的线程不安全的集合就不能胜任,为了满足在多线程场景下安全高效的开发,ConcurrentHashMap应运而生。
两个问题:
1.为什么HashMap在多线程下不安全?
HashMap在多线程环境下进行put操作会引起死循环,导致cpu的利用率达到100%
2.是什么导致的不安全的事情发生?
HashMap在并发执行put操作时,导致HashMap的Entry链表形成环形数据结构,然后Entry的next一直有值,永远向下获取。
这里提一嘴,HashTable虽然具有线程安全的特点,但是由于锁的粒度非常大,将整个数组都加上了锁,在多线程对table读写操作时竞争非常激烈,严重影响性能。所以HashTable虽然是线程安全的,但是效率十分低下,一般不会被使用。
在jdk1.7中,ConcurrentHashMap使用了锁分段的技术,将HashMap数组分成一段一段加锁,在并发访问不同段的数据时,每个线程可以获取每段上自己的锁,数据段之间互不影响。
Segment数组是需要获取的可重入锁,HashEntry是每一个锁下的数据段,与HashMap的数据结构相似,由数组加链表组成,这样就完成了对HashMap数组加分段锁,每次想要对数据段的内容进行操作,就需要首先获得相应的可重入锁。
Jdk1.8后,ConcurrentHashMap变成了数组+链表+红黑树的结构,锁的粒度调整为每个链表的头结点,定位节点的hash算法简化了,这样会加大hash冲突,所以当链表中的元素个数超过8个的时候,链表转换成红黑树进行存储。采用Node+CAS+Synchronized保证安全并发。
|