同步局部变量

时间:2014-10-21 08:28:44

标签: java multithreading java-8 synchronized concurrenthashmap

我注意到ConcurrentHashMap's compute and computeIfAbsent methods中有一个奇怪的构造:

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
  //...
}

考虑到JIT最有可能将其视为无操作,本地对象同步的重点是什么?

1 个答案:

答案 0 :(得分:26)

在代码获取对象的监视器之后,对对象的引用存储在tab中,ConcurrentHashMap是构成Node<K,V> r = new ReservationNode<K,V>(); synchronized (r) { if (casTabAt(tab, i, null, r)) { 内容的全局可见节点数组:

ConcurrentHashMap

此时,在同一Node上执行其他修改方法的其他线程在遍历全局数组时可能会遇到此不完整的节点,换句话说,ReservationNode引用已转义。

在构造Node的时刻,在其他方法中,不可能对新创建的对象进行争用,这些方法在数组中找到的Node上进行同步,可能存在对Node的争论。

这就像是“优先同步”。创建者在引用尚未转义的位置进行同步,因此保证在引用转义的时候成功,所有其他线程必须等待,在它们访问的不太可能(但仍然可能)的事件中正是{{1}}。