緩存不一致問題
在單CPU的時代里,隨著CPU性能的不斷提升,cpu的處理速度遠(yuǎn)超過cpu訪問內(nèi)存的速度刀荒,使得cpu必須等待IO完成代嗤,極大的浪費(fèi)了CPU的性能。因此緩存技術(shù)誕生了缠借,緩存可以將cpu經(jīng)常訪問的內(nèi)存數(shù)據(jù)復(fù)制一份放在緩存中供cpu讀取干毅,而訪問緩存的速度遠(yuǎn)比訪問內(nèi)存的速度快的多。但是隨著多cpu和多cpu核心的出現(xiàn)泼返,這樣的緩存技術(shù)出現(xiàn)問題硝逢。通常來說,每個線程都會映射到各個CPU核心中并行運(yùn)行绅喉,每個核心都有一個私有的緩存渠鸽。當(dāng)線程A將變量i拷貝到緩存A中進(jìn)行修改但是還沒寫回到主存當(dāng)中時,線程B也從主存中拷貝相同的數(shù)據(jù)到緩存B,因此此時兩個緩存里各有一個互不相同的變量i,這就是所謂的緩存不一致問題柴罐。為了解決緩存一致性問題徽缚,需要處理器訪問緩存時遵循一定的協(xié)議。不同的CPU硬件生產(chǎn)廠商革屠,具體的實(shí)現(xiàn)不一樣凿试。Intel的MESI協(xié)議最出名。
JAVA內(nèi)存模型
主流語言如C/C++通常使用物理硬件和操作系統(tǒng)的內(nèi)存模型似芝,因此會由于不同平臺上內(nèi)存模型的差異造成內(nèi)存訪問出錯的問題那婉。而JMM通過定義一套規(guī)范來屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異,保證java程序在各個平臺下達(dá)到一致的內(nèi)存訪問效果党瓮。而java內(nèi)存模型(JMM)仿照上述硬件緩存架構(gòu)的設(shè)計(jì)详炬,實(shí)現(xiàn)了一套JVM層面的緩存一致性。
JVM運(yùn)行程序的實(shí)體是線程麻诀,每個線程都會創(chuàng)建一個類似緩存的工作內(nèi)存(Working Memory)痕寓,工作內(nèi)存保存了該線程用到的變量的主內(nèi)存副本拷貝傲醉,線程對變量的所有操作都必須在工作內(nèi)存中進(jìn)行蝇闭,不能直接讀寫主內(nèi)存的變量。不同線程之間無法直接訪問對方工作內(nèi)存中的變量硬毕。線程間的通信是通過共享主內(nèi)存的方式實(shí)現(xiàn)的呻引。