乙個詭異的 可見性 問題

2021-09-20 08:02:48 字數 417 閱讀 8661

之前介紹過可見性的特性,最近做測試的時候發現了乙個很詭異的問題,下面看看這三個例子。

test1:

test1這個例子加了volatile,所以程式正確退出輸出test1 end

test2:

test2這個例子沒有加volatile,程式也正常退出並輸出一堆0並輸出了test2 end,這是為什麼呢?沒有加volatile為什麼也有可見性?看起來是很詭異的問題,問題是在while裡面加了一行system..輸出問題,開啟原始碼看println方法裡面加了synchronized同步塊,正是因為這個同步塊保證了裡面變數x的可見性,這個詭異的問題也就解開了。

test3:

test3這個例子即沒加volatile,也沒有在while裡面加system..輸出語句,所以執行緒對變數n3的修改對主線程不可見,程式一直迴圈,沒有輸出結果。

變數可見性問題

併發程式設計時各個執行緒中無法獲取到共享變數的最新值。共享變數儲存在主記憶體中,通常情況下各個執行緒在使用某個共享變數時先將共享變數複製進執行緒工作記憶體中,後續使用到該變數時直接從當前執行緒工作記憶體中獲取變數值,此時如果其他執行緒更改了該共享變數值那麼當前執行緒無法實時更新到該變數的最新值。同步...

015 可見性問題與volatile

一 概述 可見性問題 什麼是可見性問題?可見性問題的原因是什麼?快取之中存在共享變數的副本,在有些時候,因為來不及維護副本和實體的一致性可能造成問題,這種問題就是可見性問題.注意 當我們解決的原子性的同時也就完成了可見性的問題的解決.二 可見性性問題的例子 public class visiable...

驗證Volatile可見性問題的關鍵

關鍵在於 while flag 中不能有從主記憶體讀取的操作 常見的兩種 thread.sleep,觸發了執行緒的重新排程,儲存當前執行緒上下文,即刷到主記憶體。存在synchronized,當獲取鎖以後,清空本地記憶體中共享變數,從主記憶體進行載入,在釋放鎖時將本地記憶體中共享變數重新整理到主記憶...