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

詳解Java中的內存屏障

 更新時間:2021年05月10日 09:24:24   作者:青年it男  
這篇文章主要介紹了Java中的內存屏障的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下

為什么要有內存屏障

這個是為了解決因為cpu,高速緩存,主內存出現(xiàn)的時候,導致的可見性和重序性問題,什么問題呢,看下面
我們都知道計算機運算任務需要CPU和內存相互配合共同完成,其中CPU負責邏輯計算,內存負責數(shù)據(jù)存儲。CPU要與內存進行交互,如讀取運算數(shù)據(jù)、存儲運算結果等。由于內存和CPU的計算速度有幾個數(shù)量級的差距,為了提高CPU的利用率,現(xiàn)代處理器結構都加入了一層讀寫速度盡可能接近CPU運算速度的高速緩存來作為內存與CPU之間的緩沖:將運算需要使用的數(shù)據(jù)復制到緩存中,讓CPU運算可以快速進行,計算結束后再將計算結果從緩存同步到主內存中,這樣處理器就無須等待緩慢的內存讀寫了。就像下面這樣

高速緩存的引入解決了CPU和內存之間速度的矛盾,但是在多CPU系統(tǒng)中也帶來了新的問題:可見性問題和重排序問題。

首先是可見性問題:假設有兩個線程A、B分別在兩個不同的CPU上運行,它們共享同一個變量X。如果線程A對X進行修改后,并沒有將X更新后的結果同步到主內存,則變量X的修改對B線程是不可見的。這樣就會造成可見性問題

然后是重排序問題:假設A、B兩個線程共享兩個變量X、Y,A和B分別在不同的CPU上運行。在A中先更改變量X的值放到高速緩存區(qū),然后再更改變量Y的值放到高速緩存區(qū)。這時有可能發(fā)生Y的值被同步回主內存,而X的值沒有同步回主內存的情況,此時對于B線程來說是無法感知到X變量被修改的,或者可以認為對于B線程來說,Y變量的修改被重排序到了X變量修改的前面。

就是為了解決上面的多線程里面的可見性和重序性問題,所以有了下面的內存屏障技術

內存屏障的主要組成

首先是硬件上面的內存屏障

  • Load屏障,是x86上的”ifence“指令,在其他指令前插入ifence指令,可以讓高速緩存中的數(shù)據(jù)失效,強制當前線程從主內存里面加載數(shù)據(jù)
  • Store屏障,是x86的”sfence“指令,在其他指令后插入sfence指令,能讓當前線程寫入高速緩存中的最新數(shù)據(jù)更新寫入主內存,讓其他線程可見。

Java里面的內存屏障

在java里面有4種,就是 LoadLoad,StoreStore,LoadStore,StoreLoad,實際上也能看出來,這四種都是上面的兩種的組合產生的

LoadLoad屏障:

舉例語句是Load1; LoadLoad; Load2(這句里面的LoadLoad里面的第一個Load對應Load1加載代碼,然后LoadLoad里面的第二個Load對應Load2加載代碼),此時的意思就是在Load2加載代碼在要讀取的數(shù)據(jù)之前,保證Load1加載代碼要從主內存里面讀取的數(shù)據(jù)讀取完畢。

StoreStore屏障:

舉例語句是 Store1; StoreStore; Store2(這句里面的StoreStore里面的第一個Store對應Store1存儲代碼,然后StoreStore里面的第二個Store對應Store2存儲代碼)。此時的意思就是在Store2存儲代碼進行寫入操作執(zhí)行前,保證Store1的寫入操作已經把數(shù)據(jù)寫入到主內存里面,確認Store1的寫入操作對其它處理器可見。

LoadStore屏障:

舉例語句是 Load1; LoadStore; Store2(這句里面的LoadStore里面的Load對應Load1加載代碼,然后LoadStore里面的Store對應Store2存儲代碼),此時的意思就是在Store2存儲代碼進行寫入操作執(zhí)行前,保證Load1加載代碼要從主內存里面讀取的數(shù)據(jù)讀取完畢。

舉例語句是 Load1; LoadStore; Store2(這句里面的LoadStore里面的Load對應Load1加載代碼,然后LoadStore里面的Store對應Store2存儲代碼),此時的意思就是在Store2存儲代碼進行寫入操作執(zhí)行前,保證Load1加載代碼要從主內存里面讀取的數(shù)據(jù)讀取完畢。

StoreLoad屏障:

舉例語句是Store1; StoreLoad; Load2(這句里面的StoreLoad里面的Store對應Store1存儲代碼,然后StoreLoad里面的Load對應Load2加載代碼),在Load2加載代碼在從主內存里面讀取的數(shù)據(jù)之前,保證Store1的寫入操作已經把數(shù)據(jù)寫入到主內存里面,確認Store1的寫入操作對其它處理器可見。

Volatile關鍵字里面的內存屏障是起作用的

在每個volatile寫操作前插入StoreStore屏障,這樣就能讓其他線程修改A變量后,把修改的值對當前線程可見,在寫操作后插入StoreLoad屏障,這樣就能讓其他線程獲取A變量的時候,能夠獲取到已經被當前線程修改的值

在每個volatile讀操作前插入LoadLoad屏障,這樣就能讓當前線程獲取A變量的時候,保證其他線程也都能獲取到相同的值,這樣所有的線程讀取的數(shù)據(jù)就一樣了,在讀操作后插入LoadStore屏障;這樣就能讓當前線程在其他線程修改A變量的值之前,獲取到主內存里面A變量的的值。

以上就是詳解Java中的內存屏障的詳細內容,更多關于Java 內存屏障的資料請關注腳本之家其它相關文章!

相關文章

  • 使用Java編寫一個文件批量重命名工具

    使用Java編寫一個文件批量重命名工具

    這篇文章主要為大家詳細介紹了如何使用Java編寫一個文件批量重命名工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • SpringBoot詳解Banner的使用

    SpringBoot詳解Banner的使用

    這篇文章主要介紹了超個性修改SpringBoot項目的啟動banner的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Java反射的應用之動態(tài)代理深入理解

    Java反射的應用之動態(tài)代理深入理解

    這篇文章主要介紹了Java反射的應用之動態(tài)代理深入理解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Spring Boot CLI安裝教程

    Spring Boot CLI安裝教程

    Spring Boot是一個命令行工具,用于使用Spring進行快速原型搭建。本文重點給大家介紹Spring Boot CLI安裝教程,感興趣的朋友參考下吧
    2017-08-08
  • SpringCloud Stream消息驅動實例詳解

    SpringCloud Stream消息驅動實例詳解

    這篇文章主要介紹了SpringCloud Stream消息驅動的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java中的CAS和自旋鎖詳解

    Java中的CAS和自旋鎖詳解

    這篇文章主要介紹了Java中的CAS和自旋鎖詳解,CAS算法(Compare And Swap),即比較并替換,是一種實現(xiàn)并發(fā)編程時常用到的算法,Java并發(fā)包中的很多類都使用了CAS算法,需要的朋友可以參考下
    2023-10-10
  • 使用Java8中Optional機制的正確姿勢

    使用Java8中Optional機制的正確姿勢

    我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional,下面這篇文章主要給大家介紹了關于如何正確使用Java8中Optional機制的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Java創(chuàng)建和填充PDF表單域方法

    Java創(chuàng)建和填充PDF表單域方法

    在本篇文章中小編給大家分享了關于Java創(chuàng)建和填充PDF表單域方法和步驟,有需要的朋友們學習下。
    2019-01-01
  • java實現(xiàn)LFU算法的示例代碼

    java實現(xiàn)LFU算法的示例代碼

    LFU(Least Frequently Used)算法根據(jù)數(shù)據(jù)的歷史訪問頻率來淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)過去被訪問多次,那么將來被訪問的頻率也更高”,本文為大家整理了Java實現(xiàn)LFU算法的示例代碼,需要的可以參考下
    2023-11-11
  • SpringMVC返回圖片的幾種方式(小結)

    SpringMVC返回圖片的幾種方式(小結)

    這篇文章主要介紹了SpringMVC返回圖片的幾種方式(小結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

安庆市| 白朗县| 新安县| 耿马| 盘锦市| 合肥市| 扎赉特旗| 那坡县| 慈溪市| 鞍山市| 壶关县| 金坛市| 广州市| 喀什市| 辽源市| 亚东县| 安达市| 松滋市| 黔西县| 大兴区| 宝丰县| 桂林市| 祥云县| 西安市| 池州市| 绿春县| 新和县| 新源县| 云林县| 永和县| 玉门市| 格尔木市| 策勒县| 攀枝花市| 日喀则市| 平陆县| 阿勒泰市| 岱山县| 德钦县| 垫江县| 吕梁市|