Java源码分析——ConcurrentHashMap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33661044/article/details/79229325

HashMap在高并发情况下添加值容易出现环形链,不能保证数据的安全性,所以ConcurrentHashMap作为替代方式出现了,concurrentHashmap比hashtable更加高效,因为hashtable是将整个对象锁住,当一个线程在操作时,其它线程不能有任何操作。


要理解它只需要理解一个重要的概念segment。每一个segment相当于一个hashmap,有2的N次方多个,保存在segments数组中,所以可以这样认为concurrenthashmap是一个二维哈希表,在一个hash表中每一个元素又是一个hash表,不同的segments是可以并发操作的,同一个segmen一个线程读和一个线程写也是可以的,但是同一个segment一个线程写,另一个线程也写是不行的。
get()方法是不加锁的,具体思路如下:

  1. 根据key的hashCode()方法得到hash值
  2. 根据这个hash值定位到segment对象
  3. 再次根据hash值定位到segment对象数组中具体位置

put方法是加锁的
1.根据key的hashCode()方法得到hash值
2.通过hash值,定位到对应的Segment对象
3.synchronized获取可重入锁
4.再次通过hash值,定位到Segment当中数组的具体位置。
5.插入或覆盖对象。
6.释放锁。

猜你喜欢

转载自blog.csdn.net/qq_33661044/article/details/79229325