Java 內存模型規範了 JVM 如何提供按需禁用緩存和編譯優化的方法。具體來講,這些方法包括 volatile、synchronized 和 final 三個關鍵字,以及六項 Happens-Before 規則。緩存
Happens-Before的7個規則:markdown
(1).程序次序規則:在一個線程內,按照程序代碼順序,書寫在前面的操做先行發生於書寫在後面的操做。準確地說,應該是控制流順序而不是程序代碼順序,由於要考慮分支、循環等結構。 (2).管程鎖定規則:一個unlock操做先行發生於後面對同一個鎖的lock操做。這裏必須強調的是同一個鎖,而"後面"是指時間上的前後順序。 (3).volatile變量規則:對一個volatile變量的寫操做先行發生於後面對這個變量的讀操做,這裏的"後面"一樣是指時間上的前後順序。 (4).線程啓動規則:Thread對象的start()方法先行發生於此線程的每個動做。 (5).線程終止規則:線程中的全部操做都先行發生於對此線程的終止檢測,咱們能夠經過Thread.join()方法結束、Thread.isAlive()的返回值等手段檢測到線程已經終止執行。 (6).線程中斷規則:對線程interrupt()方法的調用先行發生於被中斷線程的代碼檢測到中斷事件的發生,能夠經過Thread.interrupted()方法檢測到是否有中斷髮生。 (7).對象終結規則:一個對象的初始化完成(構造函數執行結束)先行發生於它的finalize()方法的開始。
Happens-Before的1個特性:傳遞性。app