volatile關鍵字一般在多執行緒下使用,主要體現在以下幾個方面:
1、保證執行緒之間的可見性
執行緒之間的可見性就要從java的記憶體模型來分析了,每個執行緒都有自己的堆疊空間,java的變數都是存盤在主記憶體中的,主記憶體是共享區域,所有的子執行緒都是可以訪問的,但每個執行緒之間的堆疊空間都是不可見,執行緒對變數的操作只能從主記憶體中拷貝到自己的堆疊空間,不能直接操作主記憶體中的變數,各個堆疊空間都有自己的變數副本拷貝,所以各個堆疊空間之間是無法訪問對方的堆疊空間的,只有對變數操作的時候才會去主記憶體中拷貝
volatile的可見性是只要某個執行緒中的變數發生了改變,賦值給主記憶體的時候回立即更新其他執行緒的值,這就體現了volatile關鍵字的可見性
2、禁止指令重排
在多執行緒模式下執行緒會交替執行,編譯器會優化指令的重排,無法保證資料的一致性,而volatile禁止指令重排可以解決這個問題
3、不能保證原子性
各個執行緒對主記憶體變數的操作都是直接拷貝到自己的堆疊空間中操作,操作完后再寫回主記憶體中,如果A執行緒拷貝了主記憶體中的變數到自己的堆疊空間,這時候A執行緒被掛起,然后B執行緒也拷貝了主記憶體中的變數到自己的堆疊空間,對該變數操作完成之后寫回主記憶體,執行緒重新調度到A執行緒,這時的A執行緒的堆疊空間中的變數并不是最新值,A執行緒操作完后依然會寫回了主記憶體,所以volatile不能保證原子性
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146277.html
標籤:Java
上一篇:SpringBoot2.0+Shiro+MyBatisPlus權限管理系統
下一篇:求幫忙,這個有點迷奧
