java - 在局部变量上同步

标签 java multithreading java-8 synchronized concurrenthashmap

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

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

考虑到 JIT 很可能将其视为无操作,在本地对象上进行同步有什么意义?

最佳答案

在代码获取对象的监视器之后,对该对象的引用被存储到 tab 中,这是构成 ConcurrentHashMap< 内容的全局可见的节点数组:

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

此时,在同一个ConcurrentHashMap上执行其他修改方法的其他线程可能会在遍历全局数组时遇到这个不完整的节点,也就是Node引用逃跑了。

虽然在构造 ReservationNode 的那一点上,在其他方法中,在 Node 上同步的其他方法中不可能争用新创建的对象在数组中找到 s,则可能恰好争用该 Node

这就像“优先同步”。创建者在引用尚未转义的点进行同步,因此保证成功,而在引用转义的点,所有其他线程将不得不等待,在他们访问的不太可能(但仍然可能)的事件中正是那个Node

关于java - 在局部变量上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26482149/

相关文章:

java - 如何在 Android 应用程序的 Activity 中显示 system.out.println() 在控制台中显示的内容?

java - 与 Foo.class.bar Method() 和 Foo.bar Method() 不同

java - 在每个方法的开头和结尾执行命令(Java 和/或 C++)

java - 在 PaintComponent() 内创建时,JTextField 出现在 2 个位置

ruby-on-rails - Ruby 中的线程安全枚举器

c++ - Windows 驱动程序、自旋锁获取和条件测试

c++ - 创建互斥问题

java - 将 List<MyType> 重组为 List<List<MyType>>

Java8 Lambda 表达式评估

java - 如何在java-8中查找流类型