Java Memory Model簡稱JMM, 是一系列的Java虛擬機平臺對開發(fā)者提供的多線程環(huán)境下的內(nèi)存可見性、是否可以重排序等問題的無關(guān)具體平臺的統(tǒng)一的保證。(可能在術(shù)語上與Java運行時內(nèi)存分布有歧義,后者指堆、方法區(qū)、線程棧等內(nèi)存區(qū)域)。
并發(fā)編程有多種風格,除了CSP(通信順序進程)、Actor等模型外,大家最熟悉的應(yīng)該是基于線程和鎖的共享內(nèi)存模型了。在多線程編程中,需要注意三類并發(fā)問題:
·原子性
·可見性
·重排序
原子性涉及到,一個線程執(zhí)行一個復(fù)合操作的時候,其他線程是否能夠看到中間的狀態(tài)、或進行干擾。典型的就是i++的問題了,兩個線程同時對共享的堆內(nèi)存執(zhí)行++操作,而++操作在JVM、運行時、CPU中的實現(xiàn)都可能是一個復(fù)合操作, 例如在JVM指令的角度來看是將i的值從堆內(nèi)存讀到操作數(shù)棧、加上一、再寫回到堆內(nèi)存的i,這幾個操作的期間,如果沒有正確的同步,其他線程也可以同時執(zhí)行,可能導(dǎo)致數(shù)據(jù)丟失等問題。常見的原子性問題又叫競太條件,是基于一個可能失效的結(jié)果進行判斷,如讀取-修改-寫入。 可見性和重排序問題都源于系統(tǒng)的優(yōu)化。
由于CPU的執(zhí)行速度和內(nèi)存的存取速度嚴重不匹配,為了優(yōu)化性能,基于時間局部性、空間局部性等局部性原理,CPU在和內(nèi)存間增加了多層高速緩存,當需要取數(shù)據(jù)時,CPU會先到高速緩存中查找對應(yīng)的緩存是否存在,存在則直接返回,如果不存在則到內(nèi)存中取出并保存在高速緩存中?,F(xiàn)在多核處理器越基本已經(jīng)成為標配,這時每個處理器都有自己的緩存,這就涉及到了緩存一致性的問題,CPU有不同強弱的一致性模型,最強的一致性安全性最高,也符合我們的順序思考的模式,但是在性能上因為需要不同CPU之間的協(xié)調(diào)通信就會有很多開銷。
典型的CPU緩存結(jié)構(gòu)示意圖如下
CPU的指令周期通常為取指令、解析指令讀取數(shù)據(jù)、執(zhí)行指令、數(shù)據(jù)寫回寄存器或內(nèi)存。串行執(zhí)行指令時其中的讀取存儲數(shù)據(jù)部分占用時間較長,所以CPU普遍采取指令流水線的方式同時執(zhí)行多個指令, 提高整體吞吐率,就像工廠流水線一樣。
讀取數(shù)據(jù)和寫回數(shù)據(jù)到內(nèi)存相比執(zhí)行指令的速度不在一個數(shù)量級上,所以CPU使用寄存器、高速緩存作為緩存和緩沖,在從內(nèi)存中讀取數(shù)據(jù)時,會讀取一個緩存行(cache line)的數(shù)據(jù)(類似磁盤讀取讀取一個block)。數(shù)據(jù)寫回的模塊在舊數(shù)據(jù)沒有在緩存中的情況下會將存儲請求放入一個store buffer中繼續(xù)執(zhí)行指令周期的下一個階段,如果存在于緩存中則會更新緩存,緩存中的數(shù)據(jù)會根據(jù)一定策略flush到內(nèi)存。
public class MemoryModel { private int count; private boolean stop; public void initCountAndStop() { count = 1; stop = false; } public void doLoop() { while(!stop) { count++; } } public void printResult() { System.out.println(count); System.out.println(stop); } }
新聞名稱:Java內(nèi)存模型JMM詳解-創(chuàng)新互聯(lián)
瀏覽路徑:http://jinyejixie.com/article44/coiihe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、全網(wǎng)營銷推廣、App設(shè)計、靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容