1. 程式人生 > >併發程式設計之JMM

併發程式設計之JMM

一、JMM定義

Java記憶體模型即Java Memory ModelJMM)JMM決定一個執行緒對共享變數的寫入何時對另一個執行緒可見記憶體可見性),從抽象的角度來看,JMM定義了執行緒和主記憶體之間的抽象關係執行緒之間的共享變數儲存在主記憶體(main memory)中,每個執行緒都有一個私有的本地記憶體(local memory),本地記憶體中儲存了該執行緒以讀/寫共享變數的副本

二、JVMJava記憶體模型的實現

三、硬體記憶體架構

四、支撐Java記憶體模型的基礎原理

1、指令重排序

在執行程式時,為了提高效能,編譯器和處理器會對指令做重排序,

JMM可以通過插入特定型別的Memory Barrier來禁止。volatile的實現(如果一個變數是volatile修飾的,JMM會在寫入這個欄位之後插進一個Write-Barrier指令,並在讀這個欄位之前插入一個Read-Barrier指令)

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:

https://blog.csdn.net/lxm55913153/article/details/79208126