欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

我們?cè)诒酒獌?nèi)容里聊一聊JAVA的內(nèi)存模型和Happens-Before規(guī)則。

JAVA內(nèi)存模型

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

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

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

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

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

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

volatile不是JAVA獨(dú)有的關(guān)鍵字,它最開始的含義就是禁用CPU緩存,JAVA1.5之后對(duì)它進(jìn)行了語義加強(qiáng),就是引入了一套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 會(huì)是多少呢?
  }
 }
}

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

Happens-Before 規(guī)則

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

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

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

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

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

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

volatile變量規(guī)則

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

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

傳遞性

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

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

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

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

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

管程中鎖的規(guī)則

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

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

線程start()規(guī)則

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

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

線程join()規(guī)則

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

總結(jié)

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

我們?cè)诓l(fā)專欄中理解前者就可以了。

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

相關(guān)文章

  • log4j2的高并發(fā)死鎖問題配置優(yōu)化方式

    log4j2的高并發(fā)死鎖問題配置優(yōu)化方式

    這篇文章主要介紹了log4j2的高并發(fā)死鎖問題配置優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解

    SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解

    MinIO?是一個(gè)基于Apache?License?v2.0開源協(xié)議的對(duì)象存儲(chǔ)服務(wù),它是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,所以下面我們就來看看SpringBoot如何整合MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)吧
    2023-10-10
  • Java中多線程Reactor模式的實(shí)現(xiàn)

    Java中多線程Reactor模式的實(shí)現(xiàn)

    多線程Reactor模式旨在分配多個(gè)reactor每一個(gè)reactor獨(dú)立擁有一個(gè)selector,本文就詳細(xì)的來介紹一下Java中多線程Reactor模式的實(shí)現(xiàn),需要的朋友可以參考下
    2021-12-12
  • 如何解決創(chuàng)建maven工程時(shí),產(chǎn)生“找不到插件的錯(cuò)誤”問題

    如何解決創(chuàng)建maven工程時(shí),產(chǎn)生“找不到插件的錯(cuò)誤”問題

    這篇文章主要介紹了如何解決創(chuàng)建maven工程時(shí),產(chǎn)生“找不到插件的錯(cuò)誤”問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java編程調(diào)用微信分享功能示例

    Java編程調(diào)用微信分享功能示例

    這篇文章主要介紹了Java編程調(diào)用微信分享功能,結(jié)合實(shí)例形式分析了java微信分享功能接口的定義與調(diào)用相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Java實(shí)現(xiàn)拆箱和裝箱的原理解析

    Java實(shí)現(xiàn)拆箱和裝箱的原理解析

    Java 是一種強(qiáng)類型語言,然而在 Java中Integer類型和 int類型兩種不同類型的數(shù)字卻能正常地進(jìn)行數(shù)學(xué)運(yùn)算,為什么?今天我們就來聊聊其背后的秘密:拆箱和裝箱,感興趣的小伙伴跟著小編一起來看看吧
    2024-05-05
  • Springboot如何添加server.servlet.context-path相關(guān)使用

    Springboot如何添加server.servlet.context-path相關(guān)使用

    這篇文章主要介紹了Springboot如何添加server.servlet.context-path相關(guān)使用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java?移動(dòng)文件,并修改名稱方式

    java?移動(dòng)文件,并修改名稱方式

    這篇文章主要介紹了java?移動(dòng)文件,并修改名稱方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • JDK8 new ReentrantLock((true)加鎖流程

    JDK8 new ReentrantLock((true)加鎖流程

    這篇文章主要介紹了java面試中常遇到的問題JDK8 new ReentrantLock((true)加鎖流程示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序

    Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序

    這篇文章主要為大家詳細(xì)介紹了插入排序,希爾排序和歸并排序的多種語言的實(shí)現(xiàn)(JavaScript、Python、Go語言、Java),感興趣的小伙伴可以了解一下
    2022-12-12

最新評(píng)論