成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解volatile類型——從Java虛擬機內(nèi)存模型角度

mushang / 2322人閱讀

摘要:本文從內(nèi)存模型角度,探討的實現(xiàn)原理。通過共享內(nèi)存或者消息通知這兩種方法,可以實現(xiàn)通信或同步?;诠蚕韮?nèi)存的線程通信是隱式的,線程同步是顯式的而基于消息通知的線程通信是顯式的,線程同步是隱式的。鎖規(guī)則鎖的解鎖,于于鎖的獲取或加鎖。

一、前言

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

二、Java內(nèi)存模型(JMM) 1、并發(fā)編程關(guān)鍵問題

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

2、happens-before模型

JMM呈現(xiàn)給程序員的模型是happens-before模型,即:

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

鎖規(guī)則: 鎖的解鎖,happens before于于鎖的獲取或加鎖。

volatile變量規(guī)則:volatile寫操作,happens before于后續(xù)該變量的讀操作是可見的。

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

這兒的happens-before,并不是指操作先于后續(xù)操作執(zhí)行,而是指操作結(jié)果對于后續(xù)結(jié)果是可見的。

3、可見性

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

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

三、volatile類型的內(nèi)存語義

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

四、volatile類型的JMM實現(xiàn)

再深入一些,JMM是如何實現(xiàn)happens-before模型中的volatile規(guī)則的呢?是通過限制這兩種操作的重排序?qū)崿F(xiàn)的。

重排序規(guī)則 第二個操作
第一個操作 volatile讀 volatile寫 普通讀/寫
volatile讀 禁止重排序(1) 禁止重排序(2) 禁止重排序(3)
volatile寫 禁止重排序(4) 禁止重排序(5) -
普通讀/寫 - 禁止重排序(6) -

(1) 第一個操作是volatile讀時,不可以重排序,否則讀出來的結(jié)果,可能是被修改過了的。
(2)(5)(6),第二個是volatile寫時,所有操作都不可以被重排序于其后面,因為要確保其寫的結(jié)果對于后續(xù)操作可見。

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

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

適用于對volatile變量的寫操作很少而讀操作很多的環(huán)境

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70451.html

相關(guān)文章

  • 深入理解JVM》讀書筆記

    摘要:抽時間重新讀了一遍深入理解一書。驗證確保文件的字節(jié)流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。可見性可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。 抽時間重新讀了一遍《深入理解JVM》一書。以下為摘錄內(nèi)容。 1 java內(nèi)存區(qū)域 showImg(https://segmentfault.com/img/bVboDgk?w=617&h=365...

    idealcn 評論0 收藏0
  • Week 1 - Java 多線程 - Java 內(nèi)存模型

    摘要:目的是解決由于多線程通過共享內(nèi)存進行通信時,存在的原子性可見性緩存一致性以及有序性問題。最多只有一個線程能持有鎖。線程加入規(guī)則對象的結(jié)束先行發(fā)生于方法返回。 前言 學習情況記錄 時間:week 1 SMART子目標 :Java 多線程 學習Java多線程,要了解多線程可能出現(xiàn)的并發(fā)現(xiàn)象,了解Java內(nèi)存模型的知識是必不可少的。 對學習到的重要知識點進行的記錄。 注:這里提到的是Ja...

    zhaofeihao 評論0 收藏0
  • 讀書筆記之深入理解Java虛擬

    摘要:前言本文內(nèi)容基本摘抄自深入理解虛擬機,以供復習之用,沒有多少參考價值。此區(qū)域是唯一一個在虛擬機規(guī)范中沒有規(guī)定任何情況的區(qū)域。堆是所有線程共享的內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建。虛擬機上把方法區(qū)稱為永久代。 前言 本文內(nèi)容基本摘抄自《深入理解Java虛擬機》,以供復習之用,沒有多少參考價值。想要更詳細了解請參考原書。 第二章 1.運行時數(shù)據(jù)區(qū)域 showImg(https://segment...

    jaysun 評論0 收藏0
  • Java問題匯總,持續(xù)更新到GitHub

    摘要:目錄介紹問題匯總具體問題好消息博客筆記大匯總年月到至今,包括基礎(chǔ)及深入知識點,技術(shù)博客,學習筆記等等,還包括平時開發(fā)中遇到的匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續(xù)完善開源的文件是格式的同時也開源了生活博客,從年 目錄介紹 00.Java問題匯總 01.具體問題 好消息 博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點,Android技...

    beita 評論0 收藏0
  • jvm原理

    摘要:在之前,它是一個備受爭議的關(guān)鍵字,因為在程序中使用它往往收集器理解和原理分析簡稱,是后提供的面向大內(nèi)存區(qū)數(shù)到數(shù)多核系統(tǒng)的收集器,能夠?qū)崿F(xiàn)軟停頓目標收集并且具有高吞吐量具有更可預測的停頓時間。 35 個 Java 代碼性能優(yōu)化總結(jié) 優(yōu)化代碼可以減小代碼的體積,提高代碼運行的效率。 從 JVM 內(nèi)存模型談線程安全 小白哥帶你打通任督二脈 Java使用讀寫鎖替代同步鎖 應用情景 前一陣有個做...

    lufficc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<