同步局部变量
我注意到ConcurrentHashMap
的compute
和computeIfAbsent
方法中有一个奇怪的构造:
Node r = new ReservationNode(); synchronized (r) { //... }
考虑到JIT最有可能将其视为无操作,本地对象同步的重点是什么?
在代码获取对象的监视器之后,对象的引用将存储到tab
,该tab
是构成ConcurrentHashMap
内容的全局可见节点数组:
Node r = new ReservationNode(); synchronized (r) { if (casTabAt(tab, i, null, r)) {
此时,在同一个ConcurrentHashMap
上执行其他修改方法的其他线程在遍历全局数组时可能会遇到此不完整的节点,换句话说, Node
引用已转义。
虽然在构造ReservationNode
,不可能在新创建的对象上进行争用,但在其他方法中,在arrays中找到的Node
上进行同步时,可能会存在对该Node
争用。
这就像是“优先同步”。 创建者在引用尚未转义的位置进行同步,因此保证在引用转义的时候成功,所有其他线程必须等待,在它们访问的不太可能(但仍然可能)的事件中正是那个Node
。
- 使用常规HashMap双重检查锁定
- 使用ConcurrentHashMap,何时需要同步?
- 并发hashmap不需要同步的getter / setter吗?
- Oracle Java ConcurrentHashMap的错误实现?
- ConcurrentHashMap中的读操作关于返回值是否可靠?
- 为什么无法锁定ConcurrentHashMap进行独占访问?
- ConcurrentHashMap.get()是否保证通过不同的线程看到以前的ConcurrentHashMap.put()?
- 从理论上讲,ConcurrentHashMap的Segment和HashMap的桶之间有什么区别?
- ConcurrentHashMap构造函数参数?