關鍵在於 while(flag){}中不能有從主記憶體讀取的操作:
常見的兩種
thread.sleep,觸發了執行緒的重新排程,儲存當前執行緒上下文,即刷到主記憶體。
存在synchronized,當獲取鎖以後,清空本地記憶體中共享變數,從主記憶體進行載入,在釋放鎖時將本地記憶體中共享變數重新整理到主記憶體中。
system.out.println(); 中存在synchronized 同第二種;
/**
* volatile 保證可見性
* 驗證這個問題的關鍵,不從主記憶體讀,讀取本地記憶體
*/public class threadproblem
// system.out.println("running...");
}system.out.println("flag is " + flag + " task end...");
}public void setflag(boolean flag)
}public static class volatile extends thread
system.out.println("flag is " + flag + " task end...");
}public void setflag(boolean flag)
}}
015 可見性問題與volatile
一 概述 可見性問題 什麼是可見性問題?可見性問題的原因是什麼?快取之中存在共享變數的副本,在有些時候,因為來不及維護副本和實體的一致性可能造成問題,這種問題就是可見性問題.注意 當我們解決的原子性的同時也就完成了可見性的問題的解決.二 可見性性問題的例子 public class visiable...
變數可見性問題
併發程式設計時各個執行緒中無法獲取到共享變數的最新值。共享變數儲存在主記憶體中,通常情況下各個執行緒在使用某個共享變數時先將共享變數複製進執行緒工作記憶體中,後續使用到該變數時直接從當前執行緒工作記憶體中獲取變數值,此時如果其他執行緒更改了該共享變數值那麼當前執行緒無法實時更新到該變數的最新值。同步...
volatile 記憶體可見性
public class volatilethread implements runnable catch interruptedexception e flag true system.out.println flag isflag public boolean isflag public cla...