【问题标题】:How to trigger a full memory fence without using sun.misc.Unsafe?如何在不使用 sun.misc.Unsafe 的情况下触发完整的内存围栏?
【发布时间】:2015-12-31 07:08:40
【问题描述】:

我有兴趣在不使用sun.misc.Unsafe 的情况下触发完整的内存围栏。

以下 Java 代码是否会触发完整的内存围栏?

public final class Foo {
    public void bar() {
        // Before memory fence?
        synchronized(this) {
            // After memory fence?
        }
    }
}

以下 Java 代码会触发完整的内存围栏吗?

public final class Foo {
    private final Object monitor = new Object();
    public void bar() {
        // Before memory fence?
        synchronized(monitor) {
            // After memory fence?
        }
    }
}

【问题讨论】:

    标签: java multithreading memory-fences


    【解决方案1】:

    你想达到什么目的。您是否只是想防止重新排序“之前”和“之后”操作?你需要你的操作是原子的吗?

    要回答这个问题,是的,锁定将具有与完整的内存栅栏相同的效果以及更多。它将确保您的之前和之后的操作不会重新排序。它还将确保您在同步块中的所有写入对其他线程都是可见的。此外,您在持有锁时完成的所有操作都将自动发生。仅仅添加一个完整的栅栏是无法完成的。

    在 java 中触发完整围栏的其他方法是写入 volatile 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2010-10-13
      • 2023-03-17
      相关资源
      最近更新 更多