volatile 記憶體語義
讀記憶體語義:當讀一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體置為無效,從主記憶體中讀取共享變數。
寫記憶體語義:當寫一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。
讀寫記憶體語義加起來,就能保證可見性:一個執行緒修改了 volatile 修飾的共享變數之後,另一個執行緒可以讀到這個修改後的值。
記憶體語義怎麼實現?需要 JMM 限制《重排序》。
限制規則如下圖:
volatile 讀寫之間禁止重排序是毋庸置疑的。
另外請看下圖,為了保證 1 happen before 4,另外兩項重排序也是需要禁止的。
而限制重排序的手段就是插入記憶體屏障:
- 在每個 volatile 讀操作的後面插入一個 LoadLoad 屏障。
- 在每個 volatile 讀操作的後面插入一個 LoadStore 屏障。
- 在每個 volatile 寫操作的前面插入一個 StoreStore 屏障。
- 在每個 volatile 寫操作的後面插入一個 StoreLoad 屏障。
記憶體屏障的型別:
相關推薦
volatile 記憶體語義
讀記憶體語義:當讀一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體置為無效,從主記憶體中讀取共享變數。 寫記憶體語義:當寫一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。 讀寫記憶體語義加起來,就能保證可見性:一個執行緒修改了 volati
volatile的記憶體語義 鎖的記憶體語義
一volatile的特性 可見性:對一個volatile變數的讀,總是能看到對這個volatile變數最後的寫入 原子性:對任意單個volatile變數的讀寫具有原子性,但類似於volatile++這種複合操作不具有原子性 二volatile寫讀建立的happens-before關係
volatile的記憶體語義
理解volatile特性的一個好方法是把volatile變數的單個讀/寫.看成是使用同一個鎖對這些單個讀/寫操作做出了同步。其實,volatile的讀寫操作與鎖的獲取與釋放有這對應的關係,我們來慢慢細看,首先看一下volatile的特性: volatile的特性 clas
volatile和鎖的記憶體語義與實現
1.volatile的記憶體語義與實現 1.1 volatile寫讀的記憶體語義 在介紹鎖的記憶體語義之前,我們先簡單介紹一下volatile寫讀的記憶體語義: 當寫一個volatile變數時,JMM會把該執行緒對應的本地記憶體中的共享變數值重新整理到主
Java併發程式設計系列之四:鎖與volatile的記憶體語義
前言 在前面的文章中已經提到過volatile關鍵字的底層實現原理:處理器的LOCK指令會使得其他處理器將快取重新整理到記憶體中(確切說是主存)以及會把其他處理器的快取設定為無效。這裡的記憶體語義則說的是在JMM中的實現,那麼為什麼要理解volatile和鎖在
JMM——volatile的記憶體語義
volatile 理解volatile特性的一個好方法: 把對volatile變數的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步 鎖的happens-before規則保證釋放鎖和獲取鎖的兩個執行緒之間的記憶體可見性, 這意味這對一個volatile變數的讀,
Java volatile的記憶體語義與AQS鎖記憶體可見性
0、引子 提到volatile首先想到就是: 到這裡大家感覺自己對volatile理解了嗎? 如果理解了,大家考慮這麼一個問題:ReentrantLock(或者其它基於AQS實現的鎖)是如何保證程式碼段中變數(變數主要是
volatile的記憶體語義與應用
volatile的記憶體語義 volatile的特性 理解volatile特性的一個好方法是把對volatile變數的單個讀/寫,堪稱是使用同一個鎖對這些單個讀/寫操作做了同步。 鎖的happens-before規則保證釋放鎖和獲取鎖的兩個執行緒之間的記憶體可見性,這意味著對一個volatile變數的讀,總是
Java記憶體模型(MESI、記憶體屏障、volatile和鎖及final記憶體語義)
![](https://img2020.cnblogs.com/blog/2211828/202012/2211828-20201216172306239-228108421.png) #### JMM (Java記憶體模型) ![](https://img2020.cnblogs.com/blog/2
java執行緒和記憶體 java 重排序 java happens-before java 記憶體語義
執行緒之間的通訊機制有兩種: 共享記憶體:在共享記憶體的併發模型裡,執行緒之間共享程式的公共狀態,通過寫-讀記憶體中的公共狀態進行隱式通訊。  
volatile的語義
1.可見性:當一個執行緒修改了這個值,新值對其他執行緒是立即可知的。當被volatile修飾的變數的值發生改變後,新值會立即從執行緒的工作記憶體重新整理到主記憶體(執行store和write操作),而且執行緒每次使用這個變數前,都會將主記憶體的值重新整理到工作記憶體(read和load操作),普通變
Java中鎖的實現與記憶體語義
1. 概述 鎖在實際使用時只是明白鎖限制了併發訪問, 但是鎖是如何實現併發訪問的, 同學們可能不太清楚, 下面這篇文章就來揭開鎖的神祕面紗. 2. 鎖的記憶體語義 當執行緒獲取鎖時, JMM會把執行緒對應的本地記憶體置為無效. 從而使得被監視器保護的臨界區的變數必須從主記憶體中讀取
【搞定Java併發程式設計】第11篇:final域的記憶體語義
上一篇文章:鎖的記憶體語義:https://blog.csdn.net/pcwl1206/article/details/84921447 目 錄: 1、final域的重排序規則 2、寫final域的重排序規則 3、讀final域的重排序規則 4、final域為引用型
【搞定Java併發程式設計】第10篇:鎖的記憶體語義
上一篇:CAS詳解:https://blog.csdn.net/pcwl1206/article/details/84892287 目 錄: 1、鎖的釋放-獲取建立的happens-before關係 2、釋放鎖和獲取鎖的記憶體語義 3、鎖記憶體語義的實現 4、conc
Java併發:volatile記憶體可見性和指令重排
1. 正確認識 volatile volatile變數具有synchronized的可見性特性,但是不具備原子特性。volatile變數可用於提供執行緒安全,但是隻能應用於非常有限的一組用例:多個變數之間或者某個變數的當前值與修改後值之間沒有約束。因此,單獨使用
併發中的volatile的語義
目錄 概述 宣告共享變數為volatile後, 對這個變數的讀/寫將會很特別. 為了揭開volatile的神祕面紗, 下面將介紹volatile的記憶體語義及volatile記憶體語義的實現. volatile的特性 理解volatile特性的一個好方法就是把對volatile變數的單個讀/寫, 看成是使用
鎖的記憶體語義
鎖的釋放-獲取建立的happens-before關係 鎖除了讓臨界區互斥執行外,還可以讓釋放鎖的執行緒向獲取一個鎖的執行緒傳送訊息。 下面是鎖釋放-獲取的示例程式碼。 class MonitorExample{ int a = 0; public synchronized void wr
記憶體屏障和 volatile 語義
背景 在閱讀java中volatile的關鍵詞語義時,發現很多書中都使用了重排序這個詞來描述,同時又講到了執行緒工作記憶體和主存等等相關知識。但是隻用那些書的抽象定義進行理解時總是感覺什麼地方說不通,最後發現,是那些書中使用的抽象遮蔽了一些對讀者的知識點,反而導致了理解上的
深入理解Java記憶體模型的volatile語義
程曉明,Java軟體工程師,國家認證的系統分析師、資訊專案管理師。專注於併發程式設計。個人郵箱:[email protected]。 volatile的特性 當我們宣告共享變數為volatile後,對這個變數的讀/寫將會很特別。理解volatile特性的一個好
java多線程03-----------------volatile內存語義
tile static www. lse 出了 行修改 nbsp 進行 無法 java多線程02-----------------volatile內存語義 volatile關鍵字是java虛擬機提供的最輕量級額的同步機制。由於volatile關鍵字與java內存模型相關