參考書(shū)籍: <<java并發(fā)編程的藝術(shù)>>
這篇文章是自己閱讀該書(shū)籍時(shí)的讀書(shū)筆記
volatile
的定義
volatile
是輕量級(jí)的 synchronized
, 它在多處理器開(kāi)發(fā)中保證了共享變量的可見(jiàn)性; volatile
比 synchronized
的使用和執(zhí)行成本更低, 因?yàn)樗粫?huì)引起線程上下文的切換和調(diào)度;
可見(jiàn)性: 當(dāng)一個(gè)線程修改一個(gè)共享變量時(shí), 另外一個(gè)線程(在修改之后)能讀到這個(gè)修改的值;
volatile
的實(shí)現(xiàn)原理
- 與實(shí)現(xiàn)原理相關(guān)的CPU術(shù)語(yǔ)
術(shù) 語(yǔ) | 描述 |
---|---|
memory barriers(內(nèi)存屏障) | 是一組處理器指令, 用于實(shí)現(xiàn)對(duì)內(nèi)存操作的順序限制 |
cache line(緩沖行) | 緩存中可以分配的最小存儲(chǔ)單位, 處理器填寫(xiě)緩存線時(shí)會(huì)加載整個(gè)緩存線, 需要使用多個(gè)主內(nèi)存讀周期 |
atomic operations(原子操作) | 不可中斷的一個(gè)或一系列操作 |
cache line fill(緩存行填充) | 當(dāng)處理器識(shí)別到從內(nèi)存中讀取操作數(shù)是可緩存的, 處理器讀取整個(gè)緩存行到適當(dāng)?shù)木彺?L1, L2, L3 或 所有) |
cache hit(緩存命中) | 如果進(jìn)行高速緩存行填充操作的內(nèi)存位置仍然是下次處理器訪問(wèn)的地址時(shí),處理器從緩存中讀取操作數(shù), 而不是從內(nèi)存讀取 |
write hit(寫(xiě)命中) | 當(dāng)處理器將操作數(shù)寫(xiě)回到一個(gè)內(nèi)存緩存的區(qū)域時(shí), 它首先會(huì)檢查這個(gè)緩存的內(nèi)存地址是否在緩存行中, 如果存在一個(gè)有效地緩存行, 則處理器將這個(gè)操作數(shù)寫(xiě)會(huì)到緩存, 而不是寫(xiě)回到內(nèi)存, 這個(gè)操作被稱為寫(xiě)命中 |
write misses the cache(寫(xiě)缺失) | 一個(gè)有效地緩存行被寫(xiě)入到不存在的內(nèi)存區(qū)域 |
-
volatile
關(guān)鍵字的實(shí)現(xiàn)原理
被volatile修飾的共享變量進(jìn)行寫(xiě)操作時(shí)會(huì)在編譯后的匯編代碼增加一個(gè)lock前綴的指令, 這條lock前綴的指令的作用:- 將當(dāng)前處理器緩存行的數(shù)據(jù)寫(xiě)回到系統(tǒng)內(nèi)存
- 這個(gè)寫(xiě)回內(nèi)存的操作會(huì)使其他CPU里緩存了該內(nèi)存地址的數(shù)據(jù)無(wú)效
這里重點(diǎn)關(guān)注 緩存一致性協(xié)議(機(jī)制):
每個(gè)處理器通過(guò)嗅探在總線上傳播的數(shù)據(jù)來(lái)檢查自己緩存的值是否過(guò)期, 當(dāng)處理器發(fā)現(xiàn)自己緩存行對(duì)應(yīng)的內(nèi)存地址(的值)被修改, 就會(huì)將當(dāng)前處理器的緩存行設(shè)置成無(wú)效狀態(tài), 當(dāng)處理器對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改操作的時(shí)候, 會(huì)重新從系統(tǒng)內(nèi)存中把數(shù)據(jù)讀到處理器緩存里
volatile實(shí)現(xiàn)原理的大致圖解