01.java内存模型
文章目錄
- 1. 簡述
- 2. JAVA 內存模型的規則
- 2.1. 對線程的非共享變量不做任何處理
- 2.2. 線程共享變量提供同步機制
- 2.2.1 同步順序
- 2.2.2. HAPPENS-BEFORE
- 參考
1. 簡述
??感覺最近看JAVA的內存模型相關的東西看的有點暈,加上前看操作系統也接觸到操作系統層面也有內存模型的概念,感覺操作系統的都看懂了java的還是沒有整太明白這里嘗試對思考的東西做一個總結,希望后面能夠不斷補充。
??在這里嘗試對內存模型做一個定義和解釋。java官方這里有對內存模型的一個基本定義,不知道怎么翻譯才好,我覺得內存模型是一組規則,這一組規則定義了程序對內存中的單個或多個變量操作之間的可見性應該是怎么樣的。通過這些規則來規范對內存的讀寫操作,從而保證指令執行的正確性。
THE MEMORY MODEL DETERMINES WHAT VALUES CAN BE READ AT EVERY POINT IN THE PROGRAM
內存模型存在的原因:
這兩個原因導致了,在多線程對數據進行競爭的時候可能出現一些不確定的執行結果,也就是程序可能輸出A也有可能輸出B,全看具體執行的情況,這樣的話程序就不具備最終一致性了,所以可定是不行的。所以內存模型主要還是對數據競爭的情況下數據的一致性作出的一些規范。
2. JAVA 內存模型的規則
2.1. 對線程的非共享變量不做任何處理
??對線程的非共享變量不做任何處理。也就是線程方法棧內的變量,這些變量不能被外部線程訪問到,所以不需要做太多同步性要求,這些變量由線程內的語義控制就行,也就是滿足線程內數據一致性AS-IF-SERIAL 這里有一些概念介紹。
2.2. 線程共享變量提供同步機制
??對于共享變量,提供的有同步的機制,但是這些不是自動同步的,需要使用同步語義VOLATILE,SYNCHRONIZED去使用這些同步規則 ,在沒有使用任何同步機制的情況下,JAVA內存模型只保證線程內的數據一致性(也稱為AS-IF-SERIAL),也就是在一個線程內,能夠保證對同一個變量的讀寫是保持嚴格的程序邏輯執行順序的
下面這個指令無法被重排序,因為第二條依賴了第一條。
但是對于不同內存的操作,JMM是允許的
比如下面的這個,在執行的時候是可能改變的
THREAD 1 1: R2 = A; 2: B = 1;執行的時候可能會變成這樣
THREAD 1 2: B = 1; 1: R2 = A;這樣的調整是不影響JMM規范的,但是考慮下面這種情況,假如兩個線程并發的話,就會出現數據問題
THREAD 1 THREAD 2 1: R2 = A; 3: R1 = B; 2: B = 1; 4: A = 2;可能會出現R2 == 2 AND R1 == 1
所以對于共享變量的操作JMM提供了一些約束規范來進行保證共享數據的一致性
2.2.1 同步順序
??JMM規定了一些同步操作,這些同步之間對應的需要保證同步順序,也就是保證程序在執行這些操作的順序性。
對應的同步操作有
1.VOLATILE READ. A VOLATILE READ OF A VARIABLE. 2.VOLATILE WRITE. A VOLATILE WRITE OF A VARIABLE. 3.LOCK. LOCKING A MONITOR 4.UNLOCK. UNLOCKING A MONITOR. 5.THE (SYNTHETIC) FIRST AND LAST ACTION OF A THREAD. 6.ACTIONS THAT START A THREAD OR DETECT THAT A THREAD HAS TERMINATED (§17.4.4).對應的同步順序有
2.2.2. HAPPENS-BEFORE
HAPPENS-BEFORE 主要強調了可見性,如果A HAPPEN-BEFORE B, 那么A對共享內存所有的操作對B來說都是可見的。
對應的HAPPEN-BEFORE有以下幾種
上面5條HAPPEN-BEFORE規則涵蓋了多線程編程中的鎖、共享變量讀寫、線程生命周期和對象初始化等等重要內容,普通開發人員不用深入了解JMM,只需要知道這5條規則,可以很輕松的處理多線程場景。
以上總結也說不上特別準確,覺得網上的資料眾說紛紜,希望后面能看到更權威的解釋。
參考
HTTPS://DOCS.ORACLE.COM/JAVASE/SPECS/JLS/SE8/HTML/JLS-17.HTML#JLS-17.4
HTTPS://MONKEYSAYHI.GITHUB.IO/2017/12/28/%E4%B8%80%E6%96%87%E8%A7%A3%E5%86%B3%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C/
HTTPS://WWW.ZHIHU.COM/QUESTION/296949412 (第三個回答)
HTTPS://JUEJIN.IM/POST/5A2B53B7F265DA432A7B821C
https://ljalphabeta.gitbooks.io/a-primer-on-memory-consistency-and-cache-coherenc/content/
https://legacy.gitbook.com/book/ljalphabeta/a-primer-on-memory-consistency-and-cache-coherenc/details
https://blog.csdn.net/javazejian/article/details/72772461
https://www.jianshu.com/p/6745203ae1fe
(這個是里面有對應的pdf)
總結
以上是生活随笔為你收集整理的01.java内存模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 05.内存管理.md
- 下一篇: flink event-time 和连