JAVA多執行緒 共享變數的可見性問題

2021-09-23 10:33:28 字數 1116 閱讀 2269

我們知道執行緒在工作的時候有自己的私有記憶體,工作記憶體。程式執行的時候從主記憶體拉取需要的變數到工作記憶體,處理完再返回主記憶體。這篇文章總結哪些**會使執行緒去主記憶體拉取變數。

volatile修飾的變數,不論什麼語句都會從主記憶體拉取變數。

該程式能順利完成,不會死迴圈。因為「isstop 」用volatile修飾了

呼叫其他synchronized加鎖的**塊,系統會從主記憶體拉取變數。

這種情況同樣不會死迴圈。

注意,synchronized加鎖後用到的變數才會從主記憶體拉取。

只要不影響到變數的值,變數不參與運算,則不會從主記憶體中拉取,比如while,if,賦值給其他變數,作為方法引數等,如下圖**:

這種情況,程式會死迴圈。它獲得的isstop永遠都是false。

如果呼叫了被synchronized加鎖的方法,或者方法中有被synchronized加鎖的**塊,那麼變數將會從主記憶體中拉取。即使鎖的是毫不相干的物件,同樣會使得變數從主記憶體拉取,如下圖這裡的system.out.println鎖的是printstream的例項。

變數被賦值,變數參與計算,比如加減乘除,字串拼接,++,–等操作,執行緒休眠會使從主記憶體中拉取變數。下圖這些情況都不會出現死迴圈:

共享變數可見性

可見性 多執行緒環境下,乙個執行緒修改共享變數,能夠及時被其他執行緒所感知 共享變數 乙個變數在多個執行緒的工作記憶體都存在副本,這個變數就是共享變數 執行緒對共享變數的操作只能在自己的工作記憶體中進行,不能主記憶體中操作 不同執行緒之間無法訪問其他執行緒工作記憶體中的變數,執行緒間變數值的傳遞通過...

Java多執行緒可見性(一)

一 記憶體可見性 執行緒對共享變數的修改,可以及時的被其他執行緒看到。那何為共享變數呢?就是在多個執行緒的工作記憶體中存在 如下圖所示 所謂的共享變數就是主記憶體中名為s的變數,程式中所有的變數都會儲存在主記憶體中 其他執行緒也會有自己的工作記憶體,此工作記憶體的作用是為執行緒與主記憶體之間建立橋梁...

java多執行緒 執行緒之間的可見性

目錄 一 簡介 二 volatile 三 synchronized 四 不會從主記憶體拉取的操作 五 從主記憶體中拉取的操作 我們知道執行緒在工作的時候有自己的私有記憶體,工作記憶體。程式執行的時候從主記憶體拉取需要的變數到工作記憶體,處理完再返回主記憶體。這篇文章總結哪些 會使執行緒去主記憶體拉取...