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

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

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

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

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

1. 定義:

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

2. volatile實現(xiàn)原理

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

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

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

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

將當(dāng)前處理器緩存行的數(shù)據(jù)會寫回到系統(tǒng)內(nèi)存。

這個寫回內(nèi)存的操作會引起在其他CPU里緩存了該內(nèi)存地址的數(shù)據(jù)無效。

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

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

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

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

相關(guān)文章

  • idea如何關(guān)閉右側(cè)類顯示方法

    idea如何關(guān)閉右側(cè)類顯示方法

    這篇文章主要介紹了idea如何關(guān)閉右側(cè)類顯示方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中常見字符串拼接九種方式詳細(xì)例子

    Java中常見字符串拼接九種方式詳細(xì)例子

    這篇文章主要給大家介紹了關(guān)于Java中常見字符串拼接的九種方式,字符串拼接是我們在Java代碼中比較經(jīng)常要做的事情,就是把多個字符串拼接到一起,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • myeclipse創(chuàng)建servlet_動力節(jié)點Java學(xué)院整理

    myeclipse創(chuàng)建servlet_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了myeclipse創(chuàng)建servlet的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 探討Java語言中那些修飾符

    探討Java語言中那些修飾符

    在java中常見的修飾符有:abstract(抽象的)、static(靜態(tài)的)、public(公共的)、protected(受保護(hù)的)、private(私有的)、synchronized(同步的)、native(本地的)、transient(暫時的)、volatile(易失的)、final(不可改變的)。對java語言修飾符感興趣的朋友一起看看吧
    2016-11-11
  • Spring創(chuàng)建bean對象三種方式代碼實例

    Spring創(chuàng)建bean對象三種方式代碼實例

    這篇文章主要介紹了Spring創(chuàng)建bean對象三種方式代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • SpringData JPA Mongodb查詢部分字段問題

    SpringData JPA Mongodb查詢部分字段問題

    這篇文章主要介紹了SpringData JPA Mongodb查詢部分字段問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Flink ExecutionGraph生成源碼解析

    Flink ExecutionGraph生成源碼解析

    這篇文章主要為大家介紹了Flink ExecutionGraph生成源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • zookeeper+Springboot實現(xiàn)服務(wù)器動態(tài)上下線監(jiān)聽教程詳解

    zookeeper+Springboot實現(xiàn)服務(wù)器動態(tài)上下線監(jiān)聽教程詳解

    這篇文章主要介紹了zookeeper+Springboot實現(xiàn)服務(wù)器動態(tài)上下線監(jiān)聽,主要介紹了什么是服務(wù)器動態(tài)上下線監(jiān)聽及為什么要實現(xiàn)對服務(wù)器上下線的監(jiān)聽,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • SpringBoot集成極光推送的實現(xiàn)代碼

    SpringBoot集成極光推送的實現(xiàn)代碼

    工作中經(jīng)常會遇到服務(wù)器向App推送消息的需求,一般企業(yè)中選擇用極光推送的比較多,本文就介紹了SpringBoot集成極光推送的實現(xiàn)代碼,感興趣的可以了解一下
    2023-08-08
  • 詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑

    詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑

    這篇文章主要介紹了詳解SpringCloud Ribbon 負(fù)載均衡通過服務(wù)器名無法連接的神坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06

最新評論