1. 程式人生 > >JMM——volatile的記憶體語義

JMM——volatile的記憶體語義

volatile

理解volatile特性的一個好方法:

把對volatile變數的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步

鎖的happens-before規則保證釋放鎖和獲取鎖的兩個執行緒之間的記憶體可見性,

這意味這對一個volatile變數的讀,總是能看到任意執行緒對這個volatile變數最後的寫入值

鎖的語義決定了臨界區程式碼的執行具有原子性

如果是多個volatile操作或類似於volatile++這種複合操作,這些操作整體上不具有原子性

JSR-133開始,volatile變數的寫-讀可以實現執行緒之間的通訊

從記憶體語義的角度來看:

1.volatile的寫-讀與鎖的釋放-獲取有相同的記憶體效果

2. volatile寫和鎖的釋放有相同的記憶體語義

3. volatile讀與鎖的獲取有相同的記憶體語義

鎖釋放和獲取的記憶體語義

當執行緒釋放鎖的時候,JMM會把執行緒對應的本地記憶體中的共享變數重新整理到主記憶體中

當執行緒獲取鎖時,JMM會把執行緒對應的本地記憶體置為無效,

從而使得被監視器保護的臨界區程式碼必須要從主記憶體中去讀取共享變數

volatile-讀的記憶體語義

當寫一個volatile變數時,JMM會把執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體


當讀一個volatile變數時,JMM會把執行緒對應的本地記憶體置為無效,執行緒接下來將從主記憶體中讀取共享變數


相關推薦

volatile 記憶體語義

讀記憶體語義:當讀一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體置為無效,從主記憶體中讀取共享變數。 寫記憶體語義:當寫一個 volatile 變數時,JMM 將該執行緒對應的本地記憶體中的共享變數值重新整理到主記憶體。 讀寫記憶體語義加起來,就能保證可見性:一個執行緒修改了 volati

JMM——volatile記憶體語義

volatile 理解volatile特性的一個好方法: 把對volatile變數的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步 鎖的happens-before規則保證釋放鎖和獲取鎖的兩個執行緒之間的記憶體可見性, 這意味這對一個volatile變數的讀,

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併發程式設計:JMM (Java記憶體模型) 以及與volatile關鍵字詳解

計算機系統的一致性 在現代計算機作業系統中,多工處理幾乎是一項必備的功能,因為嵌入了多核處理器,計算機系統真正做到了同一時間執行若干個任務,是名副其實的多核系統。在多核系統中,為了提升CPU與記憶體的互動效率,一般都設定了一層 “快取記憶體區” 作為記憶體與處理器之間的緩衝,使得CPU在運算的過程中直接從快

Java併發程式設計系列之四:鎖與volatile記憶體語義

前言 在前面的文章中已經提到過volatile關鍵字的底層實現原理:處理器的LOCK指令會使得其他處理器將快取重新整理到記憶體中(確切說是主存)以及會把其他處理器的快取設定為無效。這裡的記憶體語義則說的是在JMM中的實現,那麼為什麼要理解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

Java併發2:JMM,volatile,synchronized,final

併發程式設計的兩個關鍵問題 併發程式設計需要處理兩個關鍵問題:執行緒之間如何通訊以及執行緒之間如何同步。 通訊是指執行緒之間以何種機制來交換資訊。執行緒之間的通訊機制有兩種:共享記憶體和訊息傳遞。 共享記憶體模型中,執行緒之間共享程式的公共狀態,通過讀-寫記憶體中的公共狀態進行隱式通訊。多條執行緒共享一

JMM記憶體與工作記憶體互動

Java虛擬機器記憶體模型中定義了8種關於主記憶體和工作記憶體的互動協議操作: lock:作用於主記憶體的變數,把一個變數標識為一條執行緒獨佔狀態。 unlock:作用於主記憶體的變數,把一個處於鎖定狀態的變數釋放出來,釋放後的變數可以被其他執行緒鎖定。 r