同步局部变量

ass*_*ias 27 java multithreading synchronized concurrenthashmap java-8

我注意到一个奇怪的结构ConcurrentHashMapcomputecomputeIfAbsent方法:

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
  //...
}
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ger 26

在代码获取对象的监视器之后,对对象的引用存储tab在全局可见的节点数组中,这些节点构成了以下内容ConcurrentHashMap:

Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) {
    if (casTabAt(tab, i, null, r)) {
Run Code Online (Sandbox Code Playgroud)

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

ReservationNode构建它的时候,没有可能在新创建的对象上进行争用,在其他方法中,Node在数组中找到的同步,可能存在争用Node.

这就像是"优先同步".创建者在引用尚未转义的位置进行同步,因此保证在引用转义的点处成功,所有其他线程将不得不等待,在它们访问的不太可能(但仍然可能)的事件中确切地说Node.