concurrentHashMap最主要特点是采用了分段锁技术,并发效果要比hashtable好一点。它的底层是一个segment数组,每个segment又链接了一个同hashtable类似的数据结构(1.7和1.8同样采用了不同的结构),由于segment继承了ReentrantLock,所以每个segment都可以加锁。
它与hashmap的一些差异
entry有一定的差异性,它除了value没有定义为final其余的都定义为final.
1.7GET:先调用segmentfor根据hash值找到对应的segment,然后根据hash运算找到元素,整个过程不需要枷锁,除非读到空值才枷锁重读。为什么不加锁,是因为get将需要的共享变量都定义为violate,比如统计segment大小的count和hashentry的value.violate变量能够在多个线程保持可见性,由于happen-before也不会读到过期的值(对violate字段的写入先于读操作)。
1.7PUT:
put方法首先定位到segment,然后在segment里进行插入操作,进入segment会获取锁,插入操作需要两个步骤,首先判断扩容,然后定位添加元素的位置放在hashtentry数组链表中。最后如果修改了数据结构则会修改count,保证get得到的值是新的,然后解除锁。
concurrentHashmap的实现,如何实现线程安全的
最新推荐文章于 2024-09-04 09:44:15 发布