多執行緒 volatile

2022-10-08 23:54:18 字數 1172 閱讀 7243

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 程式執行...