ass*_*ias 27 java multithreading synchronized concurrenthashmap java-8
我注意到一个奇怪的结构ConcurrentHashMap
的compute
和computeIfAbsent
方法:
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
.