亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

深入分析java并發編程中volatile的實現原理

2024-07-13 10:13:58
字體:
來源:轉載
供稿:網友

引言

在多線程java/292112.html">java/124853.html">并發編程中synchronized和Volatile都扮演著重要的角色,Volatile是輕量級的synchronized,它在多處理器開發中保證了共享變量的“可見性”。可見性的意思是當一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。它在某些情況下比synchronized的開銷更小,本文將深入分析在硬件層面上Inter處理器是如何實現Volatile的,通過深入分析能幫助我們正確的使用Volatile變量。

術語定義

 

術語 英文單詞 描述
共享變量   在多個線程之間能夠被共享的變量被稱為共享變量。共享變量包括所有的實例變量,靜態變量和數組元素。他們都被存放在堆內存中,Volatile只作用于共享變量。
內存屏障 Memory Barriers 是一組處理器指令,用于實現對內存操作的順序限制。
緩沖行 Cache line 緩存中可以分配的最小存儲單位。處理器填寫緩存線時會加載整個緩存線,需要使用多個主內存讀周期。
原子操作 Atomic operations 不可中斷的一個或一系列操作。
緩存行填充 cache line fill 當處理器識別到從內存中讀取操作數是可緩存的,處理器讀取整個緩存行到適當的緩存(L1,L2,L3的或所有)
緩存命中 cache hit 如果進行高速緩存行填充操作的內存位置仍然是下次處理器訪問的地址時,處理器從緩存中讀取操作數,而不是從內存。
寫命中 write hit 當處理器將操作數寫回到一個內存緩存的區域時,它首先會檢查這個緩存的內存地址是否在緩存行中,如果存在一個有效的緩存行,則處理器將這個操作數寫回到緩存,而不是寫回到內存,這個操作被稱為寫命中。
寫缺失 write misses the cache 一個有效的緩存行被寫入到不存在的內存區域。

 

Volatile的官方定義

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

為什么要使用Volatile

Volatile變量修飾符如果使用恰當的話,它比synchronized的使用和執行成本會更低,因為它不會引起線程上下文的切換和調度。

Volatile的實現原理

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

 

Java代碼: instance = new Singleton();//instance是volatile變量
匯編代碼: 0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);

 

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

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

這兩件事情在IA-32軟件開發者架構手冊的第三冊的多處理器管理章節(第八章)中有詳細闡述。

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

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

Volatile的使用優化

著名的Java并發編程大師Doug lea在JDK7的并發包里新增一個隊列集合類LinkedTransferQueue,他在使用Volatile變量時,用一種追加字節的方式來優化隊列出隊和入隊的性能。

追加字節能優化性能?這種方式看起來很神奇,但如果深入理解處理器架構就能理解其中的奧秘。讓我們先來看看LinkedTransferQueue這個類,它使用一個內部類類型來定義隊列的頭隊列(Head)和尾節點(tail),而這個內部類PaddedAtomicReference相對于父類AtomicReference只做了一件事情,就將共享變量追加到64字節。我們可以來計算下,一個對象的引用占4個字節,它追加了15個變量共占60個字節,再加上父類的Value變量,一共64個字節。

/** head of the queue */private transient final PaddedAtomicReference<QNode> head;/** tail of the queue */private transient final PaddedAtomicReference<QNode> tail;static final class PaddedAtomicReference <T> extends AtomicReference <T> {	// enough padding for 64bytes with 4byte refs	Object p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pa, pb, pc, pd, pe;	PaddedAtomicReference(T r) {		super(r);	}}public class AtomicReference <V> implements java.io.Serializable {	private volatile V value;	//省略其他代碼	}

為什么追加64字節能夠提高并發編程的效率呢? 因為對于英特爾酷睿i7,酷睿, Atom和NetBurst, Core Solo和Pentium M處理器的L1,L2或L3緩存的高速緩存行是64個字節寬,不支持部分填充緩存行,這意味著如果隊列的頭節點和尾節點都不足64字節的話,處理器會將它們都讀到同一個高速緩存行中,在多處理器下每個處理器都會緩存同樣的頭尾節點,當一個處理器試圖修改頭接點時會將整個緩存行鎖定,那么在緩存一致性機制的作用下,會導致其他處理器不能訪問自己高速緩存中的尾節點,而隊列的入隊和出隊操作是需要不停修改頭接點和尾節點,所以在多處理器的情況下將會嚴重影響到隊列的入隊和出隊效率。Doug lea使用追加到64字節的方式來填滿高速緩沖區的緩存行,避免頭接點和尾節點加載到同一個緩存行,使得頭尾節點在修改時不會互相鎖定。

那么是不是在使用Volatile變量時都應該追加到64字節呢?不是的。在兩種場景下不應該使用這種方式。第一:緩存行非64字節寬的處理器,如P6系列和奔騰處理器,它們的L1和L2高速緩存行是32個字節寬。第二:共享變量不會被頻繁的寫。因為使用追加字節的方式需要處理器讀取更多的字節到高速緩沖區,這本身就會帶來一定的性能消耗,共享變量如果不被頻繁寫的話,鎖的幾率也非常小,就沒必要通過追加字節的方式來避免相互鎖定。

總結

以上就是本文關于深入分析java并發編程中Volatile的實現原理的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人一区在线| 国产在线拍偷自揄拍精品| 精品视频在线观看日韩| 丝袜美腿精品国产二区| 中文字幕亚洲综合| 亚洲新中文字幕| 亚洲色图校园春色| 久久精品视频亚洲| 国产91在线播放精品91| 欧美性猛交xxxx黑人猛交| 国产91免费看片| 日本久久久久久久| 久久精品成人动漫| 国产欧洲精品视频| 国产精品亚洲一区二区三区| 午夜精品一区二区三区在线视频| 国内精品小视频在线观看| 日本久久久久亚洲中字幕| 97视频com| 美女999久久久精品视频| 国产女人18毛片水18精品| 精品中文视频在线| 亚洲片av在线| 国产一区二区三区四区福利| 亚洲加勒比久久88色综合| 这里只有精品在线播放| 日韩中文视频免费在线观看| 午夜剧场成人观在线视频免费观看| 国产精品视频区| 91精品免费视频| 在线观看91久久久久久| 亚洲激情在线观看| 亚洲国产成人爱av在线播放| 5566成人精品视频免费| 91亚洲精品久久久久久久久久久久| 日韩在线视频中文字幕| 精品福利视频导航| 久久精品亚洲94久久精品| 91精品久久久久久久久久久| 午夜欧美大片免费观看| 日本成熟性欧美| 欧美激情在线视频二区| 久99九色视频在线观看| 国产精品色视频| 国产日韩精品入口| 在线中文字幕日韩| 亚洲第一级黄色片| 成人欧美在线视频| 不用播放器成人网| 91九色单男在线观看| 国产精品网站视频| 国产成人精品视频| 久久久免费精品视频| 亚洲а∨天堂久久精品9966| 亚洲美女av在线播放| 久久久精品影院| 中文字幕亚洲综合久久筱田步美| 欧美日韩国产在线看| 欧美日韩国产色| 国产一区二区黄| 成人av番号网| 国产亚洲欧美另类中文| 精品国产1区2区| 久久久久久久久91| 欧美性xxxx极品高清hd直播| 亚洲剧情一区二区| 日韩免费中文字幕| 欧美激情综合色综合啪啪五月| 久久久精品在线| 91沈先生在线观看| 欧美三级xxx| 日韩欧美第一页| 91老司机精品视频| 欧美日韩在线观看视频| 国产深夜精品福利| 久久成人免费视频| 中文日韩在线观看| 精品免费在线观看| 国产欧美日韩亚洲精品| 国产99久久久欧美黑人| 久久久久久久影视| 亚洲第一二三四五区| 亚洲人午夜色婷婷| 亚洲成年网站在线观看| 18性欧美xxxⅹ性满足| 久久久久久午夜| 国产精品视频成人| 国产视频久久久| 日韩高清电影免费观看完整| 亚洲国产日韩欧美在线图片| 尤物99国产成人精品视频| 亚洲天堂视频在线观看| 精品国产91久久久久久老师| 亚洲japanese制服美女| 久久亚洲一区二区三区四区五区高| 亚洲国产精品电影在线观看| 在线精品国产欧美| 国产精品自拍小视频| 亚洲第一区第二区| 欧美亚洲在线观看| 高清欧美电影在线| 久久久久国色av免费观看性色| 欧美日韩在线看| 亚洲激情视频网站| 欧美一级淫片丝袜脚交| 一本大道香蕉久在线播放29| 国产99久久精品一区二区| 国内精品久久久久伊人av| 亚洲免费精彩视频| 国产精品久久久久福利| 国产91精品久久久| 日韩精品一区二区三区第95| 久久国产精品久久久久久| 久久亚洲国产精品成人av秋霞| 久久国产精品久久久| 国产精品一区二区性色av| 亚洲风情亚aⅴ在线发布| 亚洲激情第一页| 国产精品亚洲视频在线观看| 欧美黑人性猛交| 久青草国产97香蕉在线视频| 国产91色在线免费| 91在线免费观看网站| 91国语精品自产拍在线观看性色| 国产成人自拍视频在线观看| 国产在线观看精品| 亚洲精品91美女久久久久久久| 久久精品福利视频| 欧美另类高清videos| 最近免费中文字幕视频2019| 中文国产成人精品久久一| 国产97在线视频| 亚洲娇小xxxx欧美娇小| 日韩69视频在线观看| 国内精品久久久久影院 日本资源| 日本亚洲欧美三级| 欧美大片在线看| 亚洲国产精品女人久久久| 国外成人在线直播| 亚洲精品网站在线播放gif| 成人欧美一区二区三区黑人孕妇| 97在线视频国产| 久久亚洲精品成人| 成人免费福利在线| 亚洲国产中文字幕久久网| 久久天天躁狠狠躁夜夜躁| 亚洲精品一区中文| 亚洲欧洲黄色网| 91精品国产91久久久久久久久| 国产精品偷伦视频免费观看国产| 日韩电影免费观看中文字幕| 久久久亚洲国产天美传媒修理工| 日韩视频亚洲视频| 精品国产91久久久久久| 亚洲aaa激情| 国产一区二区三区网站| 在线观看欧美日韩| 国产精品自产拍在线观看| 欧美国产日韩一区二区三区| 亚洲japanese制服美女| 欧美日韩国产激情| 91社影院在线观看| 庆余年2免费日韩剧观看大牛| 欧美黑人极品猛少妇色xxxxx|