JMM 記憶體模型
ID問題
1.為什麼需要JMM
2JMM是什麼
3.JMM的重點內容
1.為什麼需要JMM
① 依賴處理器不同處理器處理的結果可能不一樣 ② 沒有辦法保證併發的安全 ③ 需要一個標準讓多執行緒可預期
2.JMM是什麼
① Java memory model 需要各個JVM來遵守JMM規範以便開發者利用這些規範來開發多執行緒的程式 如果沒有這樣的一個JMM記憶體模型來規範 那麼可能經過不同的規則重排序之後導致不同虛擬機器 上執行的結果不一樣 產生很大的問題 ② volatile synchornized lock 等原理都是JMM 如果沒有JMM那就是需要我們自己指定什麼時候讓 主記憶體與工作記憶體拷貝
3.JMM的重點內容
1.重排序
2.可見性
3.原子性
發生-在原則之前
ID問題
1.什麼是發生在原則之前
2.發生-在規則有哪些之前
1.幸福-在是什麼之前
發生-在規則是用來解決可見性問題的之前在時間上A動作在B動作之前發生B能保證看到A這就是發生之前
倆個操作可以用發生在來確定他們的執行順序之前如果一個操作發生在與另一個操作那麼我們就說第一個操作對於第二個操作時可見的之前
2.幸福-在的規則有哪些之前
1單執行緒規則
一個執行緒內保證了語義的序列性
2鎖操作(同步和鎖)
(對於在解鎖一個鎖之前的所有操作對於加鎖這個鎖之後的所有操作是可見的(解鎖必然發生在隨後的加鎖前)
3揮發性變數
揮發性變數的寫先發生於讀這就保證了揮發性的可見性
近朱者赤FieldVisibility.java給b加揮發性會影響全域性實現輕量級同步
B之前寫入的程式碼對讀取b後的程式碼都可見所以在寫者執行緒裡面對a的賦值一定會對讀取器執行緒裡面的讀取可見所以這裡a即使不加valitile b讀到3就可以由發生在的原則保證讀取到的都是3而不是1之前
4執行緒啟動
執行緒物件的start()方法發生-在此執行緒的每一個動作之前
5執行緒連線
如果執行緒A執行操作ThreadB.Join()併成功返回,那麼執行緒B中的任意操作發生在於執行緒A從ThreadB.Join()操作成功返回之前
6傳遞性
如果操作A發生-在操作B之前,操作B發生之前-操作C之前,那麼可以得出A發生之前-在操作C之前
7中斷
對執行緒中斷()方法的呼叫發生-在發生於被中斷執行緒的程式碼檢測到中斷時事件的發生之前
8構造方法
9工具類發生在原則之前