聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧

聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧

ID:30853801

大小:54.00 KB

頁數(shù):6頁

時間:2019-01-04

聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧_第1頁
聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧_第2頁
聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧_第3頁
聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧_第4頁
聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧_第5頁
資源描述:

《聊聊并發(fā)(1):深入分析volatile的實現(xiàn)原理-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、聊聊并發(fā)(1):深入分析Volatile的實現(xiàn)原理-編程開發(fā)技術(shù)聊聊并發(fā)(1):深入分析Volatile的實現(xiàn)原理原文出處:方騰E引言在多線程并發(fā)編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發(fā)中保證了共享變量的“可見性”。可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。它在某些情況下比synchronized的開銷更小,本文將深入分析在硬件層面上Inter處理器是如何實現(xiàn)Volatile的,通過深入分析能幫助我們止確的使用Volatile變量。術(shù)語定義術(shù)語英文單

2、詞描述共享變量在多個線程z間能夠被共享的變量被稱為共享變量。共享變雖包括所冇的實例變屋,靜態(tài)變量和數(shù)組元素。他們都被存放在堆內(nèi)存中,Volatile只作用于共享變量。內(nèi)存屏障MemoryBarriers是一組處理器指令,用于實現(xiàn)対內(nèi)存操作的順序限制。緩沖行Cacheline緩存中可以分配的最小存儲單位。處理器填寫緩存線時會加載整個緩存線,需耍使用多個主內(nèi)存讀周期。原子操作Atomicoperations不可中斷的一個或一系列操作。緩存行填充cachelinefill當處理器識別到從內(nèi)存中讀取操作數(shù)是對緩存的,處理器讀取整個緩存行到適當?shù)木彺?L1,L2,L3的或所有)緩存命中c

3、achehit如果進行高速緩存行填充操作的內(nèi)存位置仍然是下次處理器訪問的地址時,處理器從緩存中讀取操作數(shù),而不是從內(nèi)存。寫命中writehit當處理辭將操作數(shù)寫回到一個內(nèi)存緩存的區(qū)域吋,它首先會檢查這個緩存的內(nèi)存地址是否在緩存行屮,如果存在一個何效的緩存行,則處理器將這個操作數(shù)寫制到緩存,而不是寫制到內(nèi)存,這個操作被稱為寫命中。寫缺失writemissesthecache一個有效的緩存行被寫入到不存在的內(nèi)存區(qū)域。Volat訂e的官方定義Java語言規(guī)范第三版中對volatile的定義如下:java編程語言允許線程訪問共享變量,為了確保共享變量能被準確和一致的更新,線程應該確保通

4、過排他鎖單獨獲得這個變量。Java語言提供了volatile,在某些情況下比鎖更加方便。如果一個字段被聲明成volatile,java線程內(nèi)存模型確保所有線程看到這個變量的值是一致的。為什么要使用VolatileVolatile變量修飾符如果使用恰當?shù)脑?,它比synchronized的使用和執(zhí)行成本會更低,因為它不會引起線程上下文的切換和調(diào)度。Volatile的實現(xiàn)原理那么Volatile是如何來保證可見性的呢?在x86處理器下通過工具獲取J1T編譯器生成的匯編指令來看看對Volatile進行寫操作CPU會做什么事情。Java代碼:instance=newSingleton()

5、;//instance是volatile變量匯編代碼:0x01a3dcld:0,(%esp);movb$0X0,0X1104800(%csi);0x01a3dc24:?lock?addl$0X有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或其他)后再進行操作,但操

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

7、者架構(gòu)手冊的第三冊的多處理器管理章節(jié)(第八章)中有詳細闡述。Lock前綴指令會引起處理器緩存回寫到內(nèi)存。Lock而綴指令導致在執(zhí)行指令期間,聲言處理器的LOCK#信號。在多處理器環(huán)境屮,LOCK#信號確保在聲言該信號期間,處理器可以獨占使用任何共享內(nèi)存。(因為它會鎖住總線,導致其他CPU不能訪問總線,不能訪問總線就意味著不能訪問系統(tǒng)內(nèi)存),但是在最近的處理器里,LOCK#信號一?般不鎖總線,而是鎖緩存,畢竟鎖總線開銷比較人。在&1.4章節(jié)有詳細說明鎖定操作對處理器緩存的影響,對丁Intel4

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。