關於volatile,找了一堆資料看,看完後想找一個方法去做測試,測了很久,感覺跟沒有一樣。
這本書《深入理解Java內存模型》,對volatile描述中有這樣一個比喻的說法,如下代碼所示,對a的讀寫相當於對b的同步讀寫。
public volatile int a = 0; private int b = 0; public synchronized int getB(){ return b; } public synchronized void setB(int b){ this.b = b; }
也就是說,volatile只保證了讀與寫的同步,每次讀取都是得到最新值,每次寫入都是覆蓋最新值。
這就暗示著,非volatile變量的讀寫並非最新值,因為每個線程都有自己獨立的內存保存著變量的副本,並非第一時間讀取公共內存的變量。
現在,道理是明白的,接下來主要看它使用的場合和條件。
寫入值不能依賴於讀取值,例如a++,其實是一個“先讀取,再運算,後寫入”的步驟,存在了寫入值依賴於讀取值。
如果它除了讀與寫需要同步外,還需要其它同步的操作,那麼其它同步的操作,無疑肯定要借助於synchronized。如果它的讀與寫的觸發頻率遠遠高於其它同步的操作,這時候就可以考濾volatile與synchronized的並用。
關於其它的用處,可以查看這篇文章《正確使用 Volatile 變量》,今天我就先理解到這些了,有了解深入的小伙伴也分享我一下,謝謝。