併發程式設計之JMM
一、JMM定義
Java記憶體模型即Java Memory Model(JMM),JMM決定一個執行緒對共享變數的寫入何時對另一個執行緒可見(記憶體可見性),從抽象的角度來看,JMM定義了執行緒和主記憶體之間的抽象關係:執行緒之間的共享變數儲存在主記憶體(main memory)中,每個執行緒都有一個私有的本地記憶體(local memory),本地記憶體中儲存了該執行緒以讀/寫共享變數的副本。
二、JVM對Java記憶體模型的實現
三、硬體記憶體架構
四、支撐Java記憶體模型的基礎原理
1、指令重排序
在執行程式時,為了提高效能,編譯器和處理器會對指令做重排序,
2、as-if-serial
不管怎麼重排序,單執行緒下的執行結果不能被改變,編譯器、runtime和處理器都必須遵守as-if-serial語義。
3、記憶體屏障(Memory Barrier )
或記憶體柵欄,是一個CPU指令
4、happens-before
在JMM中,如果一個操作的執行結果需要對另一個操作可見,那麼這兩個操作之間必須要存在happens-before關係,這個的兩個操作既可以在同一個執行緒,也可以在不同的兩個執行緒中。
1、程式順序規則:一個執行緒中的每個操作,happens-before於該執行緒中任意的後續操作。
2、監視器鎖規則:對一個鎖的解鎖操作,happens-before於隨後對這個鎖的加鎖操作。
3、volatile域規則:對一個volatile域的寫操作,happens-before於任意執行緒後續對這個volatile域的讀。
4、傳遞性規則:如果 A happens-before B,且 B happens-before C,那麼A happens-before C。
注意:兩個操作之間具有happens-before關係,並不意味前一個操作必須要在後一個操作之前執行!僅僅要求前一個操作的執行結果,對於後一個操作是可見的。
Ref: