为什么会有ConcurrentHashMap呢?
HashMap是线程不安全的,在高并发的情况下,两个线程同时对某个哈希桶进行put操作时,可能会导致链表的收尾相接,然后导致线程一直找不到链表末端,造成死循环,导致CPU 100%。
ConcurrentHashMap的加锁原理
1.7以及之前的版本:
分段锁,就是把一个HashMap的一个大数组,分为了很多小数组,然后在每个小数组上加一个锁。
分段锁也是一种思想,虽然HashMap是一个存储数据的数据结构,即使同一时间有很多线程在put数据,但它们put的数据路由到的数组位置是不同的,所以可以把数据进行切割,缩小锁的范围,保证数据安全的同时,可以保证并发量。
1.8以及之后的版本:
HashMap的数组中每个元素,在第一次没有存放数据时,CAS操作成功的线程,成功放入数据。如果有了一个数据,对后面进行的线程进行synchronized,以数组指定位置的一个元素为monitor。
锁的粒度更小了,并发性比1.7及之前的更好,但是思想还是那个思想:缩小锁的粒度。