java多執行緒與併發 - volatile的作用及原理
一.volatile的作用
- 當一個變數加上 volatile關鍵字 之後,就具備了可見性,但不能具備原子性
- 可以防止指令重排序,在一定程度上保證指令有序性。也就是指令重排序時不能把後面的指令重排序到記憶體屏障之前的位置,而對volatile關鍵字修飾的變數的操作就相當與一個記憶體屏障。
二.volatile的使用
使用volatile時必須具備以下2個條件:
1. 對變數的寫操作不依賴於當前值 2.該變數沒有包含在具有其他變數的不變式中
反正進行非原子操作的變數不適合用volatile
- 根據volatile的作用和使用條件,大概可以知道一些volatile的使用場景了,比如可以用在做狀態標誌變數上。
volatile boolean flag;
三.實現原理
- volatile的實現是用了Lock指令。
- Lock指令的作用:
1.將當前處理器快取行(緩衝的最小單位)內容寫回到系統記憶體
2.中寫回到記憶體的操作會使其他CPU裡緩衝了該記憶體地址的資料失效(就不在緩衝中了) - 也就是當宣告變數是 volatile 的,在工作記憶體中處理完該資料會立即重新整理到主存,並使其他執行緒工作記憶體或緩衝中的該變數失效,就會重新到記憶體讀取該資料。也就保證了可見性。還是要說volatile不能像sychronized保證原子性,因為jvm只在最後寫回這最後一步讓所有執行緒可見,但中間的幾步是不安全的。
相關文章
- 【多執行緒與高併發】- 淺談volatile執行緒
- 【多執行緒與高併發 2】volatile 篇執行緒
- Java併發/多執行緒-CAS原理分析Java執行緒
- java多執行緒與併發 - 併發工具類Java執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java多執行緒(四):volatileJava執行緒
- Java多執行緒(六) volatileJava執行緒
- JAVA多執行緒併發Java執行緒
- Java多執行緒與併發之ThreadLocalJava執行緒thread
- Java併發(四)----執行緒執行原理Java執行緒
- Java多執行緒開發|volatile與偽共享問題Java執行緒
- 深入理解Java多執行緒與併發框(第⑦篇)——volatile 關鍵字Java執行緒
- Java併發指南1:併發基礎與Java多執行緒Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- java多執行緒之volatile理解Java執行緒
- Java高併發與多執行緒(一)-----概念Java執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 多執行緒與高併發(一)多執行緒入門執行緒
- 多執行緒併發執行及解決方法執行緒
- 併發程式設計之volatile與JMM多執行緒記憶體模型程式設計執行緒記憶體模型
- java多執行緒原理Java執行緒
- 併發與多執行緒基礎執行緒
- 多執行緒與併發----Semaphere同步執行緒
- 深入理解Java多執行緒與併發框(第①篇)——執行緒的狀態Java執行緒
- Java高併發與多執行緒(三)-----執行緒的基本屬性和主要方法Java執行緒
- Java多執行緒與併發基礎面試題Java執行緒面試題
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- 【多執行緒與高併發】- 執行緒基礎與狀態執行緒
- java多執行緒4:volatile關鍵字Java執行緒
- Java多執行緒(二)volatile關鍵字Java執行緒
- 【多執行緒與高併發原理篇:3_java記憶體模型】執行緒Java記憶體模型
- JAVA多執行緒和併發基礎Java執行緒
- 【Java併發】1. Java執行緒記憶體模型JMM及volatile相關知識Java執行緒記憶體模型
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 多執行緒與併發----讀寫鎖執行緒
- Java多執行緒之三volatile與等待通知機制示例Java執行緒
- 深入理解Java多執行緒與併發框(第⑪篇)——執行緒池引數Java執行緒
- Java多執行緒和併發問題集Java執行緒