我有兴趣在不使用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?
}
}
}
答案 0 :(得分:1)
你想要实现什么?您是否只是想阻止对“之前”和“之后”操作进行重新排序?你需要你的操作是原子的吗?
要回答这个问题,是的,锁定将与完整内存栏和更多具有相同的效果。它将确保您的Before和After操作不会重新订购。它还将确保同步块中的所有写入对其他线程可见。此外,在保持锁定的同时完成的所有操作都将以原子方式进行。只添加完整围栏的东西就不会完成。
在java中触发完整围栏的其他方法是写入volatile变量。