背景介绍

hashmap是一个以key -> value形式存储数据的数据结构,其底层是由数组+链表/红黑树来进行实现的。但是由于它没有对共享变量进行加锁之类的操作,所以在并发情况下使用会出现问题。在并发场景下我们也可以使用HashTable,但是由于HashTable是使用synchronize来进行同步的,所以并发性能并不是很好。例如:线程1需要将元素put到hashmap中下标为1的位置中,线程2需要将元素put到hashmap中下标为2的位置中,其实并没有公共资源争抢,但是hashtable还是会同步这2个操作。那么此时我们可以选择ConcurrentHashMap,它即没有特别重的锁,同时也可以防止并发产生的数据安全问题

JDK 1.8 以前截屏2020-12-13 下午11.10.24.png

分段锁

将原来的一个数组拆分成多个数组,每个数组对应一个锁。在插入和获取元素的时候,需要先通过hash算法及Segment数组长度定位到segment,然后再定位到具体的数组元素上(与hashmap一致),从而减少锁的范围

截屏2020-12-13 下午10.56.37.pngJDK 1.8 及以后

与hashmap一致,使用一个数组,数组里每个元素进行put操作的时候都有一个不同的锁,先使用CAS插入,如果失败了才使用synchronized对元素加锁

截屏2020-12-13 下午11.07.45.png