多執行緒 volatile

2021-09-09 06:06:40 字數 1048 閱讀 5180

目錄

1.volatile關鍵字的兩層含義

2.volatile關鍵字的原理和實現機制

3.volatile關鍵字的使用場景

4.volatile關鍵字與synchronized關鍵字的比較

(1)保證了不同執行緒對這個變數進行操作的可見性。

(2)禁止進行指令重排序,能在一定程度上保持有序性。

volatile變數是一種稍弱的同步機制,用來確保將變數更新的操作通知到其它執行緒,其致命的缺點是不支援原子性。觀察加入volatile關鍵字和沒有加入volatile關鍵字時所生成的彙編**發現,加入volatile關鍵字時,會多出乙個lock字首指令。

lock字首指令實際上相當於乙個記憶體屏障,記憶體屏障會提供3個功能:

(1)它確保指令重排序時不會把其後面的指令排到記憶體屏障之前的位置,也不會把前面的指令排到記憶體屏障之後的位置。即在執行到記憶體屏障這句指令時,在它前面的操作已經全部完成。

(2)它會強制將對快取的修改操作立即寫入主存。

(3)如果是寫操作,它會導致其它cpu中對應的快取無效。

(1)使用volatile關鍵字必須具備的兩個條件:對變數的寫操作不依賴於當前值;該變數沒有包含具有其它變數的不變式中。需要保證操作是原子性操作,才能保證使用volatile關鍵字的程式在併發時能夠正確執行。

(2)使用場景:狀態標記量,雙重檢驗。

(1)volatile效能比synchronized要好,因為volatile是執行緒同步的輕量級實現。在jdk1.6之後的版本,synchronized在執行效率上得到很大提公升,實際開發中使用到synchronized的概率還是比較大的。

(2)volatile只能修飾變數,synchronized可以修飾方法以及**塊。

(3)多執行緒訪問volatile不會發生阻塞,synchronized會出現阻塞。

(4)volatile能保證資料的可見性,但不能保證原子性。synchronized可以保證原子性,也可以間接的保證可見性。

(5)volatile解決的是變數在多執行緒之間的可見性。synchronized解決的是多執行緒之間訪問資源的同步性。

多執行緒 volatile

volatile主要用途 1 保證可見性 對volatile變數的寫指令後會加入寫屏障 寫屏障 在屏障之前的對共享變數的改動都同步到主存 對volatile變數的讀指令前會加入讀屏障 讀屏障 在該屏障之後對共享變數的讀取載入的都是主存中的新資料 2 保證有序性 寫屏障保證指令重排序時,不會講寫屏障之...

多執行緒 執行緒安全 volatile

學習思路 執行緒安全的三大特性 普通成員變數記憶體讀取流程 被volatile修飾後的成員變數 原子性 指定 塊是原子操作 要麼全成功要麼全失敗,不可拆分 可見性 修改共享變數時立即同步到主記憶體,保證對其它執行緒可見,讀取共享變數時直接從主記憶體讀取 有序性 的執行循序和語句的順序保持一致,在jv...

多執行緒之volatile

現在進入了多核時代 程式也要發生一系列變化 比如說現在單純的變數已經不再安全了 比如說乙個int型別的資料,我們同時開了幾個執行緒在跑。現在有了乙個執行緒突然改變了該int變數,我們的意圖是幾個執行緒都要把這個變數反映出來 但是往往事與願違。讓我們來分下問題所在 int a while a 程式執行...