JVM那些事--內(nèi)存模型

【綜述】
Java內(nèi)存模型詳細(xì)地描述了Java中多線程之間如何通過共享內(nèi)存進(jìn)行通信的。
首先,抽象地定義了多線程和主內(nèi)存之間的關(guān)系。
接著,抽象地定義了共享變量被線程讀寫操作間的偏序關(guān)系,即happens-before規(guī)則。
最后,Java內(nèi)存模型解決了共享變量被多線程操作的可見性問題。
【主內(nèi)存和本地內(nèi)存】
這里抽象地給出線程和主內(nèi)存間的關(guān)系定義:
多個(gè)線程間的共享變量存儲(chǔ)在主內(nèi)存;
每個(gè)線程都有一個(gè)本地內(nèi)存,本地內(nèi)存中保存的是被所屬線程讀寫的共享變量的拷貝;
線程對(duì)變量的操作都必須在本地內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存中的共享變量;

其中,本地內(nèi)存是對(duì)高速緩存、寄存器、緩沖區(qū)、編譯器優(yōu)化等軟硬件機(jī)制的抽象。


image.png

【happens-before規(guī)則】
happens-before規(guī)則抽象地定義了多線程對(duì)共享變量的讀寫操作的偏序關(guān)系,實(shí)際上就是定義了在什么條件下一個(gè)線程對(duì)于共享變量的寫操作對(duì)另一個(gè)線程可見。
An unlock on a monitor happens-before every subsequent lock on that monitor. (同步鎖和顯式鎖的可見性)

A write to a volatile field happens-before every subsequent read of that field. (volatile共享變量的可見性)

A call to start() on a thread happens-before any actions in the started thread. (start方法的可見性)

All actions in a thread happen-before any other thread successfully returns from a join() on that thread. (join方法的可見性)

The default initialization of any object happens-before any other actions (other than default-writes) of a program. (對(duì)象初始化方法的可見性)

程序次序規(guī)則:在單線程中,按照代碼的執(zhí)行順序,(時(shí)間上)先執(zhí)行的操作happen—before(時(shí)間上)后執(zhí)行的操作

傳遞性:如果操作A happen—before操作B,操作B happen—before操作C,那么可以得出A happen—before操作C

線程中斷規(guī)則:對(duì)線程interrupt()方法的調(diào)用happen—before發(fā)生于被中斷線程的代碼檢測(cè)到中斷時(shí)事件的發(fā)生。

【案例分析】
注意仔細(xì)體會(huì)使用較少的volatile(同步鎖、顯式鎖)、較多的跟volatile無關(guān)的happens-before規(guī)則來保證共享變量操作的可見性
案例1 DCL單例模式中的線程安全問題
試著應(yīng)用happens-before法則分析,見 http://blog.csdn.net/ns_code/article/details/17359719
案例2 只使用一個(gè)volatile變量,就可以保證普通共享變量和其的可見性
http://blog.csdn.net/htq__/article/details/51764156

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容