在單線程的情況下可以保證線程的有序性。
但是在多線程保持有序性必須遵守happens-before
jmm定義了保持有序性必須遵守happens-before原則。
happens-before:
1.程序次序規則:一個線程內,按照代碼順序,書寫在前面的操作先行發生於書寫在後面的操作
2.鎖定規則:一個unlock操作先行發生於後面對同一個鎖的lock操作
3.volatile變量規則:對一個變量的寫操作先行發生於後面對這個變量的讀操作(簡單地說就是讀這個變量前先進行對這個變量的寫操作)
4.傳遞規則:如果操作A先行發生於操作B,而操作B又先行發生於操作C,則可以得出操作A先行發生於操作C(這個很容易理解)
5.線程啓動規則:Thread對象的start方法先行發生於此線程的每一個動作
6.線程中斷規則:對線程interrupt()方法的調用先行發生於被中斷線程的代碼檢測到中斷事件的發生
7.線程終結規則:線程中所有的操作都先行發生於線程的終止檢測,我們可以通過Thread.join()方法結束,Thread.isAlive的返回值手段檢測到線程已經終止執行
8.對象終結規則:一個對象的初始化完成先行發生於他的finalize()方法的開始
前四個比較重要
以上