最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA內(nèi)存模型和Happens-Before規(guī)則知識點講解

 更新時間:2020年11月18日 09:50:22   作者:H.U.C-王子  
在本篇文章里小編給大家整理的是一篇關(guān)于JAVA內(nèi)存模型和Happens-Before規(guī)則知識點內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。

我們在本篇內(nèi)容里聊一聊JAVA的內(nèi)存模型和Happens-Before規(guī)則。

JAVA內(nèi)存模型

這里的JAVA內(nèi)存模型指的不是我們JVM專欄中提到的內(nèi)存分布模型,而是針對并發(fā)編程的,小伙伴們不要混淆概念了。

我們已經(jīng)知道,導(dǎo)致可見性問題的是緩存,導(dǎo)致有序性問題的是指令重排,那么禁用緩存和禁用指令重排不就可以避免出現(xiàn)這兩種問題了嗎。

但想想也知道,如果直接禁用掉,性能會大打折扣,所以正確的方式應(yīng)該是按需禁用。

只有程序員才能分析出什么時候應(yīng)該禁用,所以為了解決可見性和有序性,其實只要提供給程序員按需禁用的API接口就可以了。

JAVA的內(nèi)存模型是一個很復(fù)雜的規(guī)范,可以從不同的角度來解釋,本質(zhì)上我們可以理解成JAVA內(nèi)存模型規(guī)范了JVM如何按需禁用緩存和禁用指令重排。

具體來說這些方法包括 volatile、synchronized 和 final 等關(guān)鍵字,以及六項 Happens-Before 規(guī)則。

volatile不是JAVA獨有的關(guān)鍵字,它最開始的含義就是禁用CPU緩存,JAVA1.5之后對它進行了語義加強,就是引入了一套Happens-Before 規(guī)則。

例如下面的代碼:

class VolatileExample {
 int x = 0;
 volatile boolean v = false;
 public void writer() {
  x = 42;
  v = true;
 }
 public void reader() {
  if (v == true) {
   // 這里 x 會是多少呢?
  }
 }
}

假如線程A執(zhí)行了writer方法,線程B執(zhí)行reader方法,如果線程B發(fā)現(xiàn)了v=true,那么同時也會發(fā)現(xiàn)x=42。

Happens-Before 規(guī)則

接下來我們就來看看今天的主角,Happens-Before是什么?

Happens-Before要表達的是:前面一個操作的結(jié)果對后續(xù)操作是可見的,它約束了編譯器的優(yōu)化行為,雖允許編譯器優(yōu)化導(dǎo)致的指令重排,但是要求編譯器優(yōu)化后一定遵守 Happens-Before 規(guī)則。

都說Happens-Before對于JAVA內(nèi)存模型來講是一個比較晦澀難懂的部分,但我們一點一點來剖析,其實沒那么難理解。

程序的順序性規(guī)則

這條規(guī)則是指在一個線程中,按照程序順序,前面的操作 Happens-Before 于后續(xù)的任意操作。

這條規(guī)則還是比較容易理解的,就是保證了單線程中程序的順序性。

volatile變量規(guī)則

這條規(guī)則是指對一個 volatile 變量的寫操作, Happens-Before 于后續(xù)對這個 volatile 變量的讀操作。

這么看的話,是不是發(fā)現(xiàn)其實它就是禁用CPU緩存的意思,多線程下保證變量的可見性。

傳遞性

這條規(guī)則是指如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C。

這個傳遞性也很好理解,那么假如把傳遞性和volatile變量規(guī)則放在一起會發(fā)生什么呢?

就比如我們上文中的代碼,x=42 Happens-Before v=true,寫變量v=true Happens-Before 讀變量v,那么根據(jù)傳遞性規(guī)則,x=42 Happens-Before 讀變量v。

所以我們之前分析,如果線程B讀變量v=true,那么x=42對于線程B也是可見的。

并發(fā)工具包(java.util.concurrent)就是靠 volatile 語義來搞定可見性的,同時傳遞性也是對volatile關(guān)鍵字的增強,保證了可見性的同時也保證了有序性。

管程中鎖的規(guī)則

這條規(guī)則是指對一個鎖的解鎖 Happens-Before 于后續(xù)對這個鎖的加鎖。

這條規(guī)則其實也很容易理解,不加鎖何來解鎖一說。

線程start()規(guī)則

這條是關(guān)于線程啟動的。它是指主線程 A 啟動子線程 B 后,子線程 B 能夠看到主線程在啟動子線程 B 前的操作。

這條規(guī)則也沒什么好解釋的,就是字面意思。

線程join()規(guī)則

這條是關(guān)于線程等待的。它是指主線程 A 等待子線程 B 完成(主線程 A 通過調(diào)用子線程 B 的 join() 方法實現(xiàn)),當(dāng)子線程 B 完成后(主線程 A 中 join() 方法返回),主線程能夠看到子線程的操作。當(dāng)然所謂的“看到”,指的是對共享變量的操作。

總結(jié)

Java 的內(nèi)存模型是并發(fā)編程領(lǐng)域的一次重要創(chuàng)新,它主要分為兩部分,一部分面向編寫并發(fā)程序的應(yīng)用開發(fā)人員,另一部分是面向 JVM 的實現(xiàn)人員的。

我們在并發(fā)專欄中理解前者就可以了。

到此這篇關(guān)于JAVA內(nèi)存模型和Happens-Before規(guī)則知識點講解的文章就介紹到這了,更多相關(guān)淺談JAVA內(nèi)存模型和Happens-Before規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring事務(wù)中的事務(wù)傳播行為使用方式詳解

    Spring事務(wù)中的事務(wù)傳播行為使用方式詳解

    Spring框架作為一個輕量級的開源框架,在企業(yè)應(yīng)用開發(fā)中被廣泛使用,在Spring事務(wù)管理中,事務(wù)傳播行為是非常重要的一部分,它定義了方法如何參與到已經(jīng)存在的事務(wù)中或者如何開啟新的事務(wù),本文將詳細介紹Spring事務(wù)中的幾種事務(wù)傳播行為,詳細講解具體使用方法
    2023-06-06
  • Spring Boot中自動執(zhí)行sql腳本的實現(xiàn)

    Spring Boot中自動執(zhí)行sql腳本的實現(xiàn)

    這篇文章主要介紹了Spring Boot中自動執(zhí)行sql腳本的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 淺談Java中SimpleDateFormat 多線程不安全原因

    淺談Java中SimpleDateFormat 多線程不安全原因

    SimpleDateFormat是Java中用于日期時間格式化的一個類,本文主要介紹了淺談Java中SimpleDateFormat 多線程不安全原因,感興趣的可以了解一下
    2024-01-01
  • Java8中Stream的使用方式

    Java8中Stream的使用方式

    這篇文章主要介紹了Java8中Stream的使用方式,文章通過Stream的創(chuàng)建展開詳細的介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • 深入理解spring如何管理事務(wù)

    深入理解spring如何管理事務(wù)

    文章詳細介紹了Spring框架中的事務(wù)管理機制,包括事務(wù)的基本概念、事務(wù)管理的兩種方式、Spring事務(wù)管理的整體架構(gòu)、事務(wù)配置、聲明式事務(wù)的實現(xiàn)原理、事務(wù)的關(guān)鍵流程、事務(wù)屬性與配置,以及實際開發(fā)中常見的事務(wù)問題和解決方案,感興趣的朋友一起看看吧
    2025-01-01
  • Java中Spring擴展點詳解

    Java中Spring擴展點詳解

    這篇文章主要介紹了Java中Spring技巧之?dāng)U展點的應(yīng)用,下文Spring容器的啟動流程圖展開其內(nèi)容的相關(guān)資料,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • springboot集成junit編寫單元測試實戰(zhàn)

    springboot集成junit編寫單元測試實戰(zhàn)

    在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),本文主要介紹了springboot集成junit編寫單元測試實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java中對象和JSON格式的轉(zhuǎn)換方法代碼

    java中對象和JSON格式的轉(zhuǎn)換方法代碼

    JSON格式可以輕松地以面向?qū)ο蟮姆绞睫D(zhuǎn)換為Java對象,下面這篇文章主要給大家介紹了關(guān)于java中對象和JSON格式的轉(zhuǎn)換方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 詳解java接口基礎(chǔ)知識附思維導(dǎo)圖

    詳解java接口基礎(chǔ)知識附思維導(dǎo)圖

    這篇文章主要介紹了java接口基礎(chǔ)知識,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java設(shè)計模式之建造者模式

    Java設(shè)計模式之建造者模式

    這篇文章介紹了Java設(shè)計模式之建造者模式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

富川| 阿尔山市| 汶上县| 华容县| 太湖县| 广丰县| 马山县| 广昌县| 赤水市| 唐河县| 突泉县| 富裕县| 星座| 潞西市| 治县。| 剑川县| 大关县| 揭东县| 轮台县| 民勤县| 保山市| 绍兴县| 蛟河市| 达拉特旗| 赤峰市| 贞丰县| 大新县| 德庆县| 河南省| 安康市| 桦南县| 寿宁县| 漳浦县| 都昌县| 普宁市| 丹阳市| 阜南县| 万全县| 梁河县| 海伦市| 河源市|