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

簡(jiǎn)單易懂講解happens-before原則

 更新時(shí)間:2019年05月21日 10:06:15   作者:甜菜波波  
Java內(nèi)存模型中的happens-before是什么?為什么會(huì)有這東西的存在?一個(gè)新東西肯定是上手先,但是等我們空下來(lái)回過(guò)頭來(lái),我們還是需要去理解這些知識(shí),只有這樣我才能深刻的記住,并且運(yùn)用熟練。下來(lái)和小編來(lái)一起學(xué)習(xí)下

在接下來(lái)的敘述里我首先會(huì)說(shuō)明happens-before規(guī)則是干什么用的,然后用一個(gè)簡(jiǎn)單的小程序說(shuō)明happens-before規(guī)則

一、happens-before規(guī)則

我們編寫(xiě)的程序都要經(jīng)過(guò)優(yōu)化后(編譯器和處理器會(huì)對(duì)我們的程序進(jìn)行優(yōu)化以提高運(yùn)行效率)才會(huì)被運(yùn)行,優(yōu)化分為很多種,其中有一種優(yōu)化叫做重排序,重排序需要遵守happens-before規(guī)則,不能說(shuō)你想怎么排就怎么排,如果那樣豈不是亂了套。

happens-before部分規(guī)則如下:

1、程序順序規(guī)則:一個(gè)線程中的每個(gè)操作happens-before于該線程中的任意后續(xù)操作

2、監(jiān)視器鎖(同步)規(guī)則:對(duì)于一個(gè)監(jiān)視器的解鎖,happens-before于隨后對(duì)這個(gè)監(jiān)視器的加鎖

注1:為什么是部分happens-before原則,因?yàn)檫@篇文章是讓你理解happens-before原則,我會(huì)盡量讓你專(zhuān)注在這件事情上不被其他的所影響

注2:程序順序規(guī)則中所說(shuō)的每個(gè)操作happens-before于該線程中的任意后續(xù)操作并不是說(shuō)前一個(gè)操作必須要在后一個(gè)操作之前執(zhí)行,而是指前一個(gè)操作的執(zhí)行結(jié)果必須對(duì)后一個(gè)操作可見(jiàn),如果不滿足這個(gè)要求那就不允許這兩個(gè)操作進(jìn)行重排序

二、例:下面的方法的功能是計(jì)算一個(gè)長(zhǎng)方形面積

public double rectangleArea(double length , double width){
double leng;
double wid;
leng=length;//A
wid=width;//B
double area=leng*wid;//C
return area;
}

上面的操作在運(yùn)行之前編譯器和處理器可能會(huì)進(jìn)行優(yōu)化

在程序中

A  happens-before  B

B  happens-before C

A  happens-before C //happens-before具有傳遞規(guī)則

根據(jù)happens-before規(guī)則我們來(lái)分析重排序后可能產(chǎn)生的結(jié)果

因?yàn)锳  happens-before  B,所以A操作產(chǎn)生的結(jié)果leng一定要對(duì)B操作可見(jiàn),但是現(xiàn)在B操作并沒(méi)有用到length,所以這兩個(gè)操作可以重排序,那A操作是否可以和C操作重排序呢,如果A操作和C操作進(jìn)行了重排序,因?yàn)閘eng沒(méi)有被賦值,所以leng=0,area=0*wid也就是area=0;這個(gè)結(jié)果顯然是錯(cuò)誤的,所以A操作是不能和C操作進(jìn)行重排序的(這就是注2中說(shuō)的前一個(gè)操作的執(zhí)行結(jié)果必須對(duì)后羿操作可見(jiàn),如果不滿足這個(gè)要求就不允許這兩個(gè)操作進(jìn)行重排序)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Feign的實(shí)現(xiàn)原理

    詳解Feign的實(shí)現(xiàn)原理

    Feign是Netflix開(kāi)發(fā)的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調(diào)用HTTP API
    2021-06-06
  • Spring容器中添加bean的5種方式

    Spring容器中添加bean的5種方式

    我們知道平時(shí)在開(kāi)發(fā)中使用Spring的時(shí)候,都是將對(duì)象交由Spring去管理,那么將一個(gè)對(duì)象加入到Spring容器中,有哪些方式呢,感興趣的可以了解一下
    2021-07-07
  • Java利用File類(lèi)創(chuàng)建文件的示例代碼

    Java利用File類(lèi)創(chuàng)建文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java中的File類(lèi)創(chuàng)建文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Java 對(duì)稱(chēng)加密幾種算法分別實(shí)現(xiàn)

    Java 對(duì)稱(chēng)加密幾種算法分別實(shí)現(xiàn)

    這篇文章主要介紹了Java 對(duì)稱(chēng)加密使用DES / 3DES / AES 這三種算法分別實(shí)現(xiàn)的相關(guān)資料,這里提供了實(shí)例代碼,需要的朋友可以參考下
    2017-01-01
  • Springboot集成RabbitMQ報(bào)錯(cuò)及解決

    Springboot集成RabbitMQ報(bào)錯(cuò)及解決

    這篇文章主要介紹了Springboot集成RabbitMQ報(bào)錯(cuò)及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 排序算法圖解之Java插入排序

    排序算法圖解之Java插入排序

    插入排序是一種最簡(jiǎn)單的排序方法,它的基本思想是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而一個(gè)新的、記錄數(shù)增1的有序表。本文通過(guò)圖片合示例講解了插入排序的實(shí)現(xiàn),需要的可以了解一下
    2022-11-11
  • Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法

    Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法

    這篇文章主要介紹了Centos下SpringBoot項(xiàng)目啟動(dòng)與停止腳本的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 關(guān)于MyBatis10種超好用的寫(xiě)法(收藏)

    關(guān)于MyBatis10種超好用的寫(xiě)法(收藏)

    這篇文章主要介紹了關(guān)于MyBatis10種超好用的寫(xiě)法(收藏),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 一文弄懂fastjson

    一文弄懂fastjson

    fastjson?是一個(gè)java語(yǔ)言編寫(xiě)的高性能且功能完善的JSON庫(kù),本文主要介紹了fastjson的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢(xún)的操作代碼

    MyBatis中的關(guān)聯(lián)關(guān)系配置與多表查詢(xún)的操作代碼

    本文介紹了在MyBatis中配置和使用一對(duì)多和多對(duì)多關(guān)系的方法,通過(guò)合理的實(shí)體類(lèi)設(shè)計(jì)、Mapper接口和XML文件的配置,我們可以方便地進(jìn)行多表查詢(xún),并豐富了應(yīng)用程序的功能和靈活性,需要的朋友可以參考下
    2023-09-09

最新評(píng)論