volatile主要用途
1、保證可見性
對volatile變數的寫指令後會加入寫屏障
寫屏障:在屏障之前的對共享變數的改動都同步到主存
對volatile變數的讀指令前會加入讀屏障
讀屏障:在該屏障之後對共享變數的讀取載入的都是主存中的新資料
2、保證有序性
寫屏障保證指令重排序時,不會講寫屏障之前的**派到寫屏障之後
讀屏障保證指令重排序時,不會講讀屏障之後的**排到讀屏障之前
不能解決多個執行緒併發執行指令交錯的問題
上面的**中會有指令重排序的問題
對應的位元組碼檔案
可能會被優化為先執行24(賦值),再執行21(呼叫物件的構造方法)
當執行緒a進入同步**塊時,先執行賦值操作,但是還沒有呼叫物件的構造方法,此時執行緒b進入了方法,由於判斷不為空會直接拿到還沒有初始化完全的物件,從而產生問題
synchronized可以保證有序性,但是前提是需要將物件完全交給synchronized管理,在上面的**中由於**塊中還有對 物件 的操作,所以會有問題
(cas需要借助volatile才能讀取到共享變數的最新值來實現【比較並交換】)
在atomicinteger中 value 就被volatile修飾
原子引用:
利用cas思想
atomicreference
atomicstampedreference 解決cas產生的aba問題 可以設定版本號
atomicmarkablereference 用boolean 來表示是否被更改過
如果只是單純的累加操作 longadder 的效能要比atomiclong要更好,在有多個執行緒競爭時,設定多個累加單元cell[i](數量不會超過cpu核心數,只有cpu擁有多個核心數cas才有意義),最後講結果彙總。這樣他們累加的時候操作的是不同的cell變數,減少了cas重試失敗。
多執行緒 volatile
目錄 1.volatile關鍵字的兩層含義 2.volatile關鍵字的原理和實現機制 3.volatile關鍵字的使用場景 4.volatile關鍵字與synchronized關鍵字的比較 1 保證了不同執行緒對這個變數進行操作的可見性。2 禁止進行指令重排序,能在一定程度上保持有序性。volat...
多執行緒 執行緒安全 volatile
學習思路 執行緒安全的三大特性 普通成員變數記憶體讀取流程 被volatile修飾後的成員變數 原子性 指定 塊是原子操作 要麼全成功要麼全失敗,不可拆分 可見性 修改共享變數時立即同步到主記憶體,保證對其它執行緒可見,讀取共享變數時直接從主記憶體讀取 有序性 的執行循序和語句的順序保持一致,在jv...
多執行緒之volatile
現在進入了多核時代 程式也要發生一系列變化 比如說現在單純的變數已經不再安全了 比如說乙個int型別的資料,我們同時開了幾個執行緒在跑。現在有了乙個執行緒突然改變了該int變數,我們的意圖是幾個執行緒都要把這個變數反映出來 但是往往事與願違。讓我們來分下問題所在 int a while a 程式執行...