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

java 高并發(fā)中volatile的實現原理

 更新時間:2017年03月29日 14:36:49   作者:FEINIK  
這篇文章主要介紹了java 高并發(fā)中volatile的實現原理的相關資料,在多線程并發(fā)編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”,需要的朋友可以參考下

java 高并發(fā)中volatile的實現原理

摘要: 在多線程并發(fā)編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”??梢娦缘囊馑际钱斠粋€線程修改一個共享變量時,另外一個線程能讀到這個修改的值。它在某些情況下比synchronized的開銷更小

1. 定義:

java編程語言允許線程訪問共享變量,為了確保共享變量能被準確和一致的更新,線程應該確保通過排他鎖單獨獲得這個變量。Java語言提供了volatile,在某些情況下比鎖更加方便。如果一個字段被聲明成volatile,java線程內存模型確保所有線程看到這個變量的值是一致的

2. volatile實現原理

那么Volatile是如何來保證可見性的呢?在x86處理器下通過工具獲取JIT編譯器生成的匯編指令來看看對Volatile進行寫操作CPU會做什么事情。

Java代碼: instance = new Singleton();//instance是volatile變量

匯編代碼: 0x01a3de1d: movb $0x0,0x1104800(%esi);0x01a3de24: lock addl $0x0,(%esp);

有volatile變量修飾的共享變量進行寫操作的時候會多第二行匯編代碼,通過查IA-32架構軟件開發(fā)者手冊可知,lock前綴的指令在多核處理器下會引發(fā)了兩件事情。

將當前處理器緩存行的數據會寫回到系統(tǒng)內存。

這個寫回內存的操作會引起在其他CPU里緩存了該內存地址的數據無效。

處理器為了提高處理速度,不直接和內存進行通訊,而是先將系統(tǒng)內存的數據讀到內部緩存(L1,L2或其他)后再進行操作,但操作完之后不知道何時會寫到內存,如果對聲明了Volatile變量進行寫操作,JVM就會向處理器發(fā)送一條Lock前綴的指令,將這個變量所在緩存行的數據寫回到系統(tǒng)內存。但是就算寫回到內存,如果其他處理器緩存的值還是舊的,再執(zhí)行計算操作就會有問題,所以在多處理器下,為了保證各個處理器的緩存是一致的,就會實現緩存一致性協議,每個處理器通過嗅探在總線上傳播的數據來檢查自己緩存的值是不是過期了,當處理器發(fā)現自己緩存行對應的內存地址被修改,就會將當前處理器的緩存行設置成無效狀態(tài),當處理器要對這個數據進行修改操作的時候,會強制重新從系統(tǒng)內存里把數據讀到處理器緩存里。

Lock前綴指令會引起處理器緩存回寫到內存。Lock前綴指令導致在執(zhí)行指令期間,聲言處理器的 LOCK# 信號。在多處理器環(huán)境中,LOCK# 信號確保在聲言該信號期間,處理器可以獨占使用任何共享內存。(因為它會鎖住總線,導致其他CPU不能訪問總線,不能訪問總線就意味著不能訪問系統(tǒng)內存),但是在最近的處理器里,LOCK#信號一般不鎖總線,而是鎖緩存,畢竟鎖總線開銷比較大。在8.1.4章節(jié)有詳細說明鎖定操作對處理器緩存的影響,對于Intel486和Pentium處理器,在鎖操作時,總是在總線上聲言LOCK#信號。但在P6和最近的處理器中,如果訪問的內存區(qū)域已經緩存在處理器內部,則不會聲言LOCK#信號。相反地,它會鎖定這塊內存區(qū)域的緩存并回寫到內存,并使用緩存一致性機制來確保修改的原子性,此操作被稱為“緩存鎖定”,緩存一致性機制會阻止同時修改被兩個以上處理器緩存的內存區(qū)域數據。

一個處理器的緩存回寫到內存會導致其他處理器的緩存無效。IA-32處理器和Intel 64處理器使用MESI(修改,獨占,共享,無效)控制協議去維護內部緩存和其他處理器緩存的一致性。在多核處理器系統(tǒng)中進行操作的時候,IA-32 和Intel 64處理器能嗅探其他處理器訪問系統(tǒng)內存和它們的內部緩存。它們使用嗅探技術保證它的內部緩存,系統(tǒng)內存和其他處理器的緩存的數據在總線上保持一致。例如在Pentium和P6 family處理器中,如果通過嗅探一個處理器來檢測其他處理器打算寫內存地址,而這個地址當前處理共享狀態(tài),那么正在嗅探的處理器將無效它的緩存行,在下次訪問相同內存地址時,強制執(zhí)行緩存行填充

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • 如何使用spring-ws發(fā)布webservice服務

    如何使用spring-ws發(fā)布webservice服務

    文章介紹了如何使用Spring-WS發(fā)布Web服務,包括添加依賴、創(chuàng)建XSD文件、生成JAXB實體、配置Endpoint、啟動服務等步驟,結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • @RequestBody 部分屬性沒有轉化成功的處理

    @RequestBody 部分屬性沒有轉化成功的處理

    這篇文章主要介紹了@RequestBody 部分屬性沒有轉化成功的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解java線程的開始、暫停、繼續(xù)

    詳解java線程的開始、暫停、繼續(xù)

    本文將介紹通過線程讀取文件內容,并且可以控制線程的開始、暫停、繼續(xù),來控制讀文件。具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01
  • MyBatis Plus 將查詢結果封裝到指定實體的方法步驟

    MyBatis Plus 將查詢結果封裝到指定實體的方法步驟

    這篇文章主要介紹了MyBatis Plus 將查詢結果封裝到指定實體的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java Arrays.fill()的具體使用

    Java Arrays.fill()的具體使用

    本文主要介紹了Java Arrays.fill()的具體使用,更好地理解Arrays.fill()方法的用法以及在實際應用中如何使用它,感興趣的可以了解一下
    2023-09-09
  • Mybatis?plus多租戶方案的實戰(zhàn)踩坑記錄

    Mybatis?plus多租戶方案的實戰(zhàn)踩坑記錄

    MybaitsPlus多租戶處理器是一個對于多租戶問題的解決方案,下面這篇文章主要給大家介紹了關于Mybatis?plus多租戶方案踩坑的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • Java中使用RediSearch實現高效的數據檢索功能

    Java中使用RediSearch實現高效的數據檢索功能

    RediSearch是一款構建在Redis上的搜索引擎,它為Redis數據庫提供了全文搜索、排序、過濾和聚合等高級查詢功能,本文將介紹如何在Java應用中集成并使用RediSearch,以實現高效的數據檢索功能,感興趣的朋友跟著小編一起來看看吧
    2024-05-05
  • Spring boot集成Kafka消息中間件代碼實例

    Spring boot集成Kafka消息中間件代碼實例

    這篇文章主要介紹了Spring boot集成Kafka消息中間件代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • springboot注解Aspect實現方案

    springboot注解Aspect實現方案

    本文提供一種自定義注解,來實現業(yè)務審批操作的DEMO,不包含審批流程的配置功能。對springboot注解Aspect實現方案感興趣的朋友一起看看吧
    2022-01-01
  • springboot bootcdn使用示例詳解

    springboot bootcdn使用示例詳解

    這篇文章主要介紹了springboot bootcdn使用,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08

最新評論

光山县| 昌乐县| 法库县| 奉化市| 永福县| 武功县| 静海县| 武清区| 红桥区| 汽车| 石首市| 尚志市| 湘阴县| 利川市| 信阳市| 九寨沟县| 麟游县| 英山县| 沾益县| 高唐县| 兴宁市| 手游| 云浮市| 大宁县| 宽甸| 台中市| 横山县| 莱西市| 平罗县| 鄂托克旗| 岐山县| 富阳市| 梁河县| 沐川县| 晋州市| 卫辉市| 邵武市| 云安县| 拉孜县| 本溪| 泰顺县|