原本想找一些比較正式的資料,不過目前還沒有在手邊的書上看到有關這個的資料~。
就 [1-2] 描述有關 volatile 關鍵字,主要是說一般變數宣告的狀況,會在 JVM 當中建立一個專用的 Register 暫存區
存取記憶體時,程序會去該暫存區取得變數資料、對其做修改等動作
但修改的過程對其他程序來說是個黑洞,它們無法「看到」動作的內容,甚至不知道該變數正在被修改。
而使用 volatile 關鍵字的變數,會被存放在 JVM 公開且所有程序共享的 heap 區段中
所有的程序都可以存取到該變數鎖在的記憶體,並且可以「看到」它現在的狀況。
不過 [1] 仍然強調,volative 關鍵字並不保證 atomic,即雖然變數內容可以被大家看到
但還是不保證「讀取值 → 修改 → 寫入」這三個一系列的動作會一起完成以後才被其他程序讀取。
因此 [1] 的建議是,volative 使用的環境應該是該變數並不存在被同時寫入的狀況
或者寫入時寫入的資料與它原本的值完全不相關等等,這種狀況使用 volative 才能避免產生資料不一致的結果。
PS. 有錯誤麻煩請幫忙修正!
參考資料:
1、深入浅出 Java Concurrency (4): 原子操作 part 3 指令重排序与happens-before法则
2、Java关键字之native,strictfp,transient,volatile
沒有留言:
張貼留言