來看下面這樣乙個例子
public
class
threadtest
}});
backgroundthread.start();
timeunit.seconds.sleep(1);
stoprequested = true;
}
我們希望backgroundthread 執行緒能夠在睡眠一秒後停止,但是實際情況是執行緒陷入了死迴圈,這是為什麼呢?
其實這跟編譯器有關,編譯器有兩種模式,server和client,server模式下,編譯器為了讓執行緒執行更快,增加了對記憶體的優化,如果其中乙個執行緒更改了乙個公共變數,那麼另乙個執行緒將看不到,因為另外乙個執行緒為了使得執行更快所以從暫存器或者本地cache中取值,而不是從記憶體中取值。在這個例子中mian執行緒修改了stoprequested變數,而backgroundthread 執行緒看不到這個變化,那麼如何讓執行緒看到這個變化呢?通過volatile關鍵字,在stoprequested關鍵字前新增volatile修飾.
對volatile關鍵字的理解
volatile關鍵字是給編譯器看的,c語言是一種操作性語言,與硬體底層關係比較密切,尤其是在嵌入式領域。比如如下程式 a 1 a 2 a 4 printf d n a 經過編譯器優化後可能就變成了 a 4 printf d n a 無形中a 1和 a 2的操作就被省去了,表面是沒問題,但是在嵌入式...
對volatile關鍵字的理解
如果volatile變數與普通變數發 了重排序,雖然volatile變數能保證記憶體可 性,但是可能導致普通變數讀取錯誤 jvm通過記憶體屏障來實現限制處理器的重排序。編譯器在生成位元組碼時,會在指令序列中插入記憶體屏障來禁止特定型別的處理器重排序 編譯器選擇了 個 較保守的jmm記憶體屏障插 策略...
Volatile關鍵字理解
物理角度 由於計算機的儲存裝置和cpu的運算速度有幾個數量級的差距,所以現代計算機系統加入一層速度接近 cpu的快取記憶體 cache 但cache帶來乙個問題 快取一致性問題 在多處理器系統中,每個處理器機油自己的cache 工作記憶體 又共享同一主記憶體。舉例 當程式在執行過程中,會將運算需要的...