遇到乙個關於volatile的問題,目前還未想到原因,先記錄下來。
關於volatile的含義及功能這裡不多解釋,直接上**
public
class
volatiletestflag
system.out.
println
("a執行緒等待結束。。。");
}});
thread bthread =
newthread
(new
runnable()
catch
(interruptedexception e)}}
);athread.
start()
; bthread.
start()
;}public
static
void
changeflag()
}
但是上述**中,flag並沒有加volatile修飾,只是在while迴圈中進行了列印,athread也會跳出死迴圈,能跳出死迴圈的原因只能是flag為false,所以我想不明白原因是什麼。。。也就是不加volatile的前提下,如果while迴圈中是空的,就跳不出去,如果while迴圈中有一句列印,就可以跳出去
20210703前來解答:
今天重新看了一遍圖靈學院楊過老師對volatile,有了新的理解。其實對於上述情況沒有官方的解釋,stackoverfolw、google等等都沒有合理的解釋,甚至李二狗來了也說不清楚。
volatile的含義是:加了volatile一定會立即保證可見性,但是不加volatile不一定就沒有可見性,只是不保證即時。
如果flag加了volatile,那麼上面的**以及最終的結果很好解釋。但是如果flag不加volatile的話,會有以下幾種情況:
1.空while迴圈無法跳出,執行列印的while迴圈可以跳出:猜測是因為空while的執行優先順序是很高的,死迴圈中啥都沒有,他就一直執行下去,沒有喘息的餘地。但是但凡while迴圈中有一點**,在執行的間隙,執行緒的工作記憶體都可能會去主記憶體上載入一下,然後讀到了新的變數值;
2.flag不加volatile,新定義乙個變數i,並將i修飾為volatile,然後在while迴圈中執行i++,同樣可以跳出:這一點可以猜測認為是i和flag可能儲存在同乙個cacheline裡面了,然後讀取的時候把兩個值都載入了。
其實volatile可以理解為保證變數的幾時可見性。
記錄乙個MySQL的問題
昨天做asp.net mvc程式,用mysql.data.entity.ef6做資料連線。程式都是正常的,但就是提交資料的時候總是提示 specified key was too long max key length is 767 bytes異常。搞了好久也不知道啥原因,網上查的方法也通通不好使。...
記錄乙個未知的問題
visual studio一啟用應用程式就提示 操作無法完成,因為該檔案已在xx.exe中開啟 但是我啟動的就是xx.exe啊 然後我盃具的發現debug目錄下所有的dll都被刪除掉了 這個程式依賴很多dll,只能乙個乙個重新生成,又杯具的發現生成完成再啟動還是會遇到上面的問題,重啟vs也還是不行,...
「變還是不變,這是乙個問題?」 volatile
變還是不變,這是乙個問題?volatile 先看乙個簡單迴圈 for int i 0 i 100000 i volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的位址中讀取,因而編譯器生成的可執行碼會重新從i的位址讀取資料放在k中。而優化做法是,乙個定義為volatile的變...