一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java 高并發(fā)中volatile的實現(xiàn)原理

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

2020-09-03 14:00FEINIK Java教程

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

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

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

1. 定義:

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

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

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

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

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

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

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

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

處理器為了提高處理速度,不直接和內(nèi)存進行通訊,而是先將系統(tǒng)內(nèi)存的數(shù)據(jù)讀到內(nèi)部緩存(L1,L2或其他)后再進行操作,但操作完之后不知道何時會寫到內(nèi)存,如果對聲明了Volatile變量進行寫操作,JVM就會向處理器發(fā)送一條Lock前綴的指令,將這個變量所在緩存行的數(shù)據(jù)寫回到系統(tǒng)內(nèi)存。但是就算寫回到內(nèi)存,如果其他處理器緩存的值還是舊的,再執(zhí)行計算操作就會有問題,所以在多處理器下,為了保證各個處理器的緩存是一致的,就會實現(xiàn)緩存一致性協(xié)議,每個處理器通過嗅探在總線上傳播的數(shù)據(jù)來檢查自己緩存的值是不是過期了,當處理器發(fā)現(xiàn)自己緩存行對應(yīng)的內(nèi)存地址被修改,就會將當前處理器的緩存行設(shè)置成無效狀態(tài),當處理器要對這個數(shù)據(jù)進行修改操作的時候,會強制重新從系統(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é)有詳細說明鎖定操作對處理器緩存的影響,對于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é)議去維護內(nèi)部緩存和其他處理器緩存的一致性。在多核處理器系統(tǒng)中進行操作的時候,IA-32 和Intel 64處理器能嗅探其他處理器訪問系統(tǒng)內(nèi)存和它們的內(nèi)部緩存。它們使用嗅探技術(shù)保證它的內(nèi)部緩存,系統(tǒng)內(nèi)存和其他處理器的緩存的數(shù)據(jù)在總線上保持一致。例如在Pentium和P6 family處理器中,如果通過嗅探一個處理器來檢測其他處理器打算寫內(nèi)存地址,而這個地址當前處理共享狀態(tài),那么正在嗅探的處理器將無效它的緩存行,在下次訪問相同內(nèi)存地址時,強制執(zhí)行緩存行填充

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

原文鏈接:https://my.oschina.net/feinik/blog/842423

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黑人草 | 91真人毛片一级在线播放 | 国产卡一卡二卡四卡无卡 | 插入影院| 毛片一级毛片 | 日本护士撒尿xxxx18 | 国产在线三级 | 国产91青青成人a在线 | 亚洲欧美久久一区二区 | 白丝校花好湿好紧 | 60岁妇女毛片免费观看 | yw在线观看成人免费 | 日韩一区二区三 | 国产高清日韩 | 四虎影视884aa·com | 亚洲国产成人精品无码区99 | 亚洲男人的天堂在线 | 日韩视频一 | futa巨大好爽好长 | 天天操丝袜| 大团圆6全文在线阅读 | 欧美日韩一区二区中文字幕视频 | 女同性互吃奶乳免费视频 | 亚洲 日本 中文字幕 制服 | 美女裆部 | 99热免费在线观看 | 国产伦精一区二区三区视频 | 波多野结衣同性系列698 | 国模丰满美女冰漪34d | 精品第一国产综合精品蜜芽 | 日韩精品一区二区三区免费视频 | xxxxyoujizz护士| 超兴奋朋友的中文字幕下 | 亚洲高清中文字幕一区二区三区 | 亚洲 小说 欧美 激情 另类 | yjsp妖精视频在线观看免费 | 欧美一级欧美三级 | 久久中文字幕亚洲精品最新 | 精品国产91久久久久 | 欧洲美女人牲交一级毛片 | 2012年免费中文视频 |