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

volatile保證可見性及重排序方法

 更新時間:2022年08月04日 14:48:56   作者:Mark_Zoe  
這篇文章主要為大家介紹了volatile保證可見性及重排序方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、JMM的內存可見性保證

按程序類型,Java程序的內存可見性保證可以分為下列3類:

單線程程序:單線程程序不會出現(xiàn)內存可見性問題。編譯器、runtime和處理器會共同確保單線程程序的執(zhí)行結果與該程序在順序一致性模型中的執(zhí)行結果相同。

正確同步的多線程程序:正確同步的多線程程序的執(zhí)行將具有順序一致性(程序的執(zhí)行結果與該程序在順序一致性內存模型中的執(zhí)行結果相同)。這是JMM關注的重點,JMM通過限制編譯器和處理器的重排序來為程序員提供內存可見性保證。

未同步/未正確同步的多線程程序:JMM為它們提供了最小安全性保障:線程執(zhí)行時讀取到的值,要么是之前某個線程寫入的值,要么是默認值未同步程序在JMM中的執(zhí)行時,整體上是無序的,其執(zhí)行結果無法預知。 JMM不保證未同步程序的執(zhí)行結果與該程序在順序一致性模型中的執(zhí)行結果一致。

二、volatile的內存語義

1、volatile的特性

可見性:對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入。

原子性:對任意單個volatile變量的讀/寫具有原子性,但類似于volatile++這種復合操作不具有原子性(基于這點,我們通過會認為volatile不具備原子性)。volatile僅僅保證對單個volatile變量的讀/寫具有原子性,而鎖的互斥執(zhí)行的特性可以確保對整個臨界區(qū)代碼的執(zhí)行具有原子性。

有序性:對volatile修飾的變量的讀寫操作前后加上各種特定的內存屏障來禁止指令重排序來保障有序性。

volatile 寫-讀的內存語義:

當寫一個volatile變量時,JMM會把該線程對應的本地內存中的共享變量值刷新到主內存。

當讀一個volatile變量時,JMM會把該線程對應的本地內存置為無效,線程接下來將從主內存中讀取共享變量。

2、volatile可見性實現(xiàn)原理

JMM內存交互層面實現(xiàn):volatile修飾的變量的read、load、use操作和assign、store、write必須是連續(xù)的,即修改后必須立即同步回主內存,使用時必須從主內存刷新,由此保證volatile變量操作對多線程的可見性。

硬件層面實現(xiàn):通過lock前綴指令,會鎖定變量緩存行區(qū)域并寫回主內存,這個操作稱為“緩存鎖定”,緩存一致性機制會阻止同時修改被兩個以上處理器緩存的內存區(qū)域數(shù)據(jù)。一個處理器的緩存回寫到內存會導致其他處理器的緩存無效。

三、指令重排序

Java語言規(guī)范規(guī)定JVM線程內部維持順序化語義。即只要程序的最終結果與它順序化情況的結果相等,那么指令的執(zhí)行順序可以與代碼順序不一致,此過程叫指令的重排序。指令重排序的意義:JVM能根據(jù)處理器特性(CPU多級緩存系統(tǒng)、多核處理器等)適當?shù)膶C器指令進行重排序,使機器指令能更符合CPU的執(zhí)行特性,最大限度的發(fā)揮機器性能。在編譯器與CPU處理器中都能執(zhí)行指令重排優(yōu)化操作。

JMM內存屏障插入策略:

  • 在每個volatile寫操作的前面插入一個StoreStore屏障
  • 在每個volatile寫操作的后面插入一個StoreLoad屏障
  • 在每個volatile讀操作的后面插入一個LoadLoad屏障
  • 在每個volatile讀操作的后面插入一個LoadStore屏障

不同硬件實現(xiàn)內存屏障的方式不同,Java內存模型屏蔽了這種底層硬件平臺的差異,由JVM來為不同的平臺生成相應的機器碼。

以上就是volatile保證可見性及重排序方法的詳細內容,更多關于volatile可見性重排序的資料請關注腳本之家其它相關文章!

相關文章

  • 頁面制作統(tǒng)一的頭尾的方法(asp+js)

    頁面制作統(tǒng)一的頭尾的方法(asp+js)

    有時候我們需要統(tǒng)一頁面的頭尾,如果不是獨立,每次要修改文件,就要所有的模板頁面都要修改增加麻煩,所以,獨立頭尾調用,就只需要修改兩個頁面就可以了。
    2009-04-04
  • Web 開發(fā)中遇到的UTF-8編碼的問題總結

    Web 開發(fā)中遇到的UTF-8編碼的問題總結

    一個網(wǎng)站如果需要國際化,就需要將編碼從GB2312轉成UTF-8,其中有很多的問題需要注意,如果沒有轉換徹底,將會有很多的編碼問題出現(xiàn)!
    2010-02-02
  • HTTP請求 GET與POST方法的區(qū)別

    HTTP請求 GET與POST方法的區(qū)別

    HTTP定義了與服務器交互的不同方法,最基本的方法是 GET 和 POST.HTTP-GET和HTTP-POST是使用HTTP的標準協(xié)議動詞,用于編碼和傳送變量名/變量值對參數(shù),并且使用相關的請求語義。
    2009-12-12
  • 讓開發(fā)自動化 用 Eclipse 插件提高代碼質量

    讓開發(fā)自動化 用 Eclipse 插件提高代碼質量

    如果能在構建代碼前發(fā)現(xiàn)代碼中潛在的問題會怎么樣呢?很有趣的是,Eclipse 插件中就有這樣的工具,比如 JDepend 和 CheckStyle,它們能幫您在軟件問題暴露前發(fā)現(xiàn)這些問題。
    2009-05-05
  • git 報錯:OpenSSL SSL_read: Connection was reset, errno 10054 解決方法

    git 報錯:OpenSSL SSL_read: Connection was&

    這篇文章主要介紹了git 報錯:OpenSSL SSL_read: Connection was reset, errno 10054 解決方法,涉及git配置信息及緩存相關操作技巧,需要的朋友可以參考下
    2023-04-04
  • 算法系列15天速成 第十天 棧

    算法系列15天速成 第十天 棧

    今天跟大家聊聊棧,在程序設計中,棧的使用還是非常廣泛的,比如有“括號匹配問題“,”html結構匹配問題“。所以說掌握了”?!暗氖褂?,對我們學習算法還是很有幫助的
    2013-11-11
  • 計算機網(wǎng)絡日常練習題,每天進步一點點

    計算機網(wǎng)絡日常練習題,每天進步一點點

    下面小編就為大家?guī)硪黄嬎銠C網(wǎng)絡的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-09-09
  • WebStorm 遇到的問題總結

    WebStorm 遇到的問題總結

    這篇文章主要介紹了WebStorm 遇到的問題總結的相關資料,需要的朋友可以參考下
    2017-03-03
  • VSCode如何遠程連接Linux教程(密鑰的使用)

    VSCode如何遠程連接Linux教程(密鑰的使用)

    本文主要介紹了VSCode如何遠程連接Linux教程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Wireshark TS FTP 傳輸失敗問題解決

    Wireshark TS FTP 傳輸失敗問題解決

    這篇文章主要為大家介紹了Wireshark TS FTP 傳輸失敗問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

仙桃市| 白银市| 台安县| 牡丹江市| 绥芬河市| 红安县| 合川市| 金阳县| 枝江市| 津南区| 句容市| 石狮市| 亚东县| 南投县| 东阳市| 栖霞市| 洪洞县| 厦门市| 三亚市| 东阳市| 金山区| 洪湖市| 永昌县| 利川市| 峡江县| 得荣县| 永修县| 陆良县| 兴山县| 交城县| 错那县| 大宁县| 扬中市| 泽库县| 休宁县| 柯坪县| 郯城县| 腾冲县| 木兰县| 温泉县| 嘉禾县|