【发布时间】:2018-05-24 23:14:07
【问题描述】:
刚刚在 ConcurrentHashMap 计算方法中发现了这个奇怪的代码:(第 1847 行)
public V compute(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
...
Node<K,V> r = new ReservationNode<K,V>();
synchronized (r) { <--- what is this?
if (casTabAt(tab, i, null, r)) {
binCount = 1;
Node<K,V> node = null;
因此代码对仅对当前线程可用的新变量执行同步。这意味着没有其他线程可以竞争这个锁或造成内存屏障效应。
这个动作有什么意义?这是一个错误还是会导致一些我不知道的不明显副作用?
附言jdk1.8.0_131
【问题讨论】:
-
第 740 行周围有一个注释块,它可能会解释为什么要这样做。据我了解,该节点通过
Unsafe操作与tab变量交换,因此此时所有线程都可能开始看到它,并且此时它应该被创建节点的线程锁定,因此其他线程必须等待对节点执行任何操作。否则,有可能在交换发生后立即参加比赛。
标签: java multithreading concurrenthashmap