ConcurrentHashMap的get方法是最终一致性的

证明
线程1在时间点A调用get,之后线程2在一个时间点B再次调用get查询,在两个方法返回之前,调用put方法,覆盖刚才的数据考虑这样的执行序列。

1. 线程2读到数据,然后时间片用完
2. put成功将数据覆盖 
3. 线程1读到新数据,返回
4.线程2拿到时间片,返回旧数据

结果就是,线程1先返回拿到新数据,而线程2后返回拿到的是一个旧数据。

说明

ConcurrentHashMap的注释中已经说了,get方法只能保证看到之前完成的操作,无法保证看到正在进行中的操作。

针对jdk1.7的concurrentHashMap,对get方法讲的很好
get方法不用加锁的简单总结:

1. 访问的绝大数变量是volatile类型的,如count,node.val,node.next
2. 访问的变量只有一个不是volatile的,即table[]得每个元素,也就是说可能刚才已经成功插入一个table[i]
   =node,但是读的时候确是null
3. 当找不到的时候,它会在加锁的情况下再读一次   

猜你喜欢

转载自blog.csdn.net/qq_41634872/article/details/110246465