2015-12-31 25 views
3

我有興趣在不使用sun.misc.Unsafe的情況下觸發全內存圍欄。如何在不使用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? 
     } 
    } 
} 

回答

1

什麼是你想要的目的。你只是試圖阻止你的「之前」和「之後」操作的重新排序嗎?你需要你的操作是原子嗎?

要回答這個問題,是的,鎖定將具有完整記憶圍欄和更多的相同效果。它將確保您的Before和After操作不會被重新排序。它還將確保您在synchronized塊中的所有寫入操作對其他線程都可見。此外,您持有鎖的所有操作都將以原子方式進行。只是增加一個完整的圍欄的東西不會完成。

在java中觸發完整fence的其他方法是寫入volatile變量。

相關問題