評論

2011-08-31 143 views
1
@ThreadSafe 
public class SynchronizedInteger { 
    @GuardedBy("this") private int value; 
    public synchronized int get() { return value; } 
    public synchronized void set(int value) { this.value = value; } 
} 

書中說:評論

去想volatile變量的一個好辦法是想象,他們的行爲大致是這樣的SynchronizedInteger類 清單3.3,替換讀取和通過調用get和set來寫入volatile變量。
...
這個比喻並不準確; SynchronizedInteger的內存可見性效果實際上比volatile變量稍強。見 第16章。

我查了第16章,但沒有找到確切的答案 - 內存可見性保證如何更強?

+3

建議您改述此事。讓它成爲一個獨立的問題。稍後在實踐中添加對實踐的參考,以顯示您對答案感興趣的原因。 –

回答

5

的主要區別在於,volatile創建之前發生到volatile可變寫入和從中讀取一個subsequest之間的關係,而​​創建一個解鎖和隨後的鎖定之間之前發生的關係。

所以,在任何後續操作之間有SychrozniedInteger(即get()set()電話)創造的SynchronizedInteger情況之前發生關係,沒關係無論是讀取或寫入。它不同於volatile int提供的行爲 - 僅在寫入和隨後的讀取之間。

其實我無法想象任何有意義的例子來說明這種差異,所以這些行爲真的只是稍有不同。