日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度

發布時間:2024/7/23 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

在java多線程編程中,volatile可以用來定義輕量級的共享變量,它比synchronized的使用成本更低,因為它不會引起線程上下文的切換和調度。所謂知己知彼、百戰不殆。本文從JVM內存模型角度,探討volatile的實現原理。在明白了volatile的實現原理后,再回過頭來使用它,會有一種一覽眾山小的感覺吧,使用起來會更加得心應手。

二、Java內存模型(JMM)

1、并發編程關鍵問題

多線程編程涉及到兩個關鍵問題,線程之間的通信與同步。通信是指線程之間傳遞信息,同步是指控制線程操作的執行順序。通過共享內存或者消息通知這兩種方法,可以實現通信或同步。基于共享內存的線程通信是隱式的,線程同步是顯式的;而基于消息通知的線程通信是顯式的,線程同步是隱式的。JAVA是前者,即基于共享內存的隱式線程通信、顯式線程同步。

2、happens-before模型

JMM呈現給程序員的模型是happens-before模型,即:

順序規則:(單)線程中的寫操作的結果,happens before于于任意后續操作。

鎖規則: 鎖的解鎖,happens before于于鎖的獲取或加鎖。

volatile變量規則:volatile寫操作,happens before于后續該變量的讀操作是可見的。

傳遞性:A操作happens before于B操作,B操作happens before于C操作,則A操作happens before于C操作

這兒的happens-before,并不是指操作先于后續操作執行,而是指操作結果對于后續結果是可見的。

3、可見性

在JMM中,每個線程的內存由兩層構成:線程的“本地內存”、“主內存”。“本地內存”是JMM的一個抽象,本身是不存在的,它包括緩存、寄存器、寫緩沖區、編譯器及CPU的優化等。共享變量存放在“主內存”中,“本地內存”中存放的是共享變量的副本。當線程中發生對共享變量的寫操作時,并不是直接寫到“主內存”中的,而是先寫到“本地內存”的寫緩沖區中,只有當刷新(flush)到主內存后,才可能被其它線程加載到其“本地內存”中,此時我們說該共享變量是對其它線程“可見”的,反之如果沒有刷新(flush)到主內存,就是對于其它線程“不可見”的。

JMM就是通過控制主內存與每個線程的本地內存之間的交互,來為Java程序員提供可見性的保證的

三、volatile類型的內存語義

happens-before規則提供了對volatile變量可見性的保證,即volatile變量的寫操作,對后續任意對該變量的讀操作是可見的。

四、volatile類型的JMM實現

再深入一些,JMM是如何實現happens-before模型中的volatile規則的呢?是通過限制這兩種操作的重排序實現的。

重排序規則

第二個操作

第一個操作

volatile讀

volatile寫

普通讀/寫

volatile讀

禁止重排序(1)

禁止重排序(2)

禁止重排序(3)

volatile寫

禁止重排序(4)

禁止重排序(5)

-

普通讀/寫

-

禁止重排序(6)

-

(1) 第一個操作是volatile讀時,不可以重排序,否則讀出來的結果,可能是被修改過了的。

(2)(5)(6),第二個是volatile寫時,所有操作都不可以被重排序于其后面,因為要確保其寫的結果對于后續操作可見。

五、volatile類型使用的注意事項

多個volatile操作或復合操作,整體上不具有有序性

適用于對volatile變量的寫操作很少而讀操作很多的環境

總結

以上是生活随笔為你收集整理的java虚拟机内存模型种类_深入理解volatile类型——从Java虚拟机内存模型角度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。