??在java內(nèi)存模型中,happens-before應(yīng)該理解為:前一個(gè)操作的結(jié)果,可以被后續(xù)的操作獲取,即內(nèi)存可見性。
??為了解決多線程的內(nèi)存可見性問題,就提出了happens-before原則,讓線程之間遵守這些原則,同時(shí)對編譯器的優(yōu)化也進(jìn)行了一定的約束。
??以下是原則內(nèi)容:
1、程序次序規(guī)則
??在一個(gè)線程內(nèi),一段代碼的執(zhí)行結(jié)果是有序的。依然會有指令重排,但是不論怎么重排序,結(jié)果都是按照代碼順序生成的不會變。
2、管程鎖定規(guī)則
??無論在單線程環(huán)境還是多線程環(huán)境,對于同一個(gè)鎖來說,一個(gè)線程對這個(gè)鎖解鎖之后,另一個(gè)線程獲取了這個(gè)鎖,則它能看到前一個(gè)線程的操作結(jié)果。
3、volatile變量規(guī)則
??如果一個(gè)線程先去寫一個(gè)volatile變量,然后一個(gè)線程去讀這個(gè)變量,那么這個(gè)寫操作的結(jié)果一定對讀的這個(gè)線程可見。
4、線程啟動規(guī)則
??在主線程A執(zhí)行過程中,啟動子線程B,那么線程A在啟動子線程B之前對共享變量的修改結(jié)果對線程B可見。
5、線程終止規(guī)則
??在主線程A執(zhí)行過程中,子線程B終止,那么線程B在終止之前對共享變量的修改結(jié)果在線程A中可見。
6、線程中斷規(guī)則
??對線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程代碼檢測到中斷事件的發(fā)生,可以通過Thread.interrupted()檢測到是否發(fā)生中斷。
7、傳遞性規(guī)則
??就是happens-before原則具有傳遞性,即A happens-before B , B happens-before C,那么A
happens-before C
8、對象終結(jié)規(guī)則
??就是一個(gè)對象的初始化的完成,也就是構(gòu)造函數(shù)執(zhí)行的結(jié)束一定 happens-before它的finalize()方法
熱門工具 換一換