您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“happens-before是什么”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
happens-before字面翻譯過來就是先行發(fā)生,A happens-before B 就是A 先行發(fā)生于B?
不準(zhǔn)確!在Java內(nèi)存模型中,happens-before 應(yīng)該翻譯成:前一個操作的結(jié)果可以被后續(xù)的操作獲取。講白點(diǎn)就是前面一個操作把變量a賦值為1,那后面一個操作肯定能知道a已經(jīng)變成了1。
我們再來看看為什么需要這幾條規(guī)則?
因為我們現(xiàn)在電腦都是多CPU,并且都有緩存,導(dǎo)致多線程直接的可見性問題。詳情可以看我之前的文章
所以為了解決多線程的可見性問題,就搞出了happens-before原則,讓線程之間遵守這些原則。編譯器還會優(yōu)化我們的語句,所以等于是給了編譯器優(yōu)化的約束。不能讓它優(yōu)化的不知道東南西北了!
咱們來看看這幾條規(guī)則
程序次序規(guī)則:在一個線程內(nèi)一段代碼的執(zhí)行結(jié)果是有序的。就是還會指令重排,但是隨便它怎么排,結(jié)果是按照我們代碼的順序生成的不會變!
管程鎖定規(guī)則:就是無論是在單線程環(huán)境還是多線程環(huán)境,對于同一個鎖來說,一個線程對這個鎖解鎖之后,另一個線程獲取了這個鎖都能看到前一個線程的操作結(jié)果!(管程是一種通用的同步原語,synchronized就是管程的實(shí)現(xiàn))
volatile變量規(guī)則:就是如果一個線程先去寫一個volatile變量,然后一個線程去讀這個變量,那么這個寫操作的結(jié)果一定對讀的這個線程可見。
線程啟動規(guī)則:在主線程A執(zhí)行過程中,啟動子線程B,那么線程A在啟動子線程B之前對共享變量的修改結(jié)果對線程B可見。
線程終止規(guī)則:在主線程A執(zhí)行過程中,子線程B終止,那么線程B在終止之前對共享變量的修改結(jié)果在線程A中可見。
線程中斷規(guī)則:對線程interrupt()方法的調(diào)用先行發(fā)生于被中斷線程代碼檢測到中斷事件的發(fā)生,可以通過Thread.interrupted()檢測到是否發(fā)生中斷。
傳遞規(guī)則:這個簡單的,就是happens-before原則具有傳遞性,即A happens-before B , B happens-before C,那么A happens-before C。
對象終結(jié)規(guī)則:這個也簡單的,就是一個對象的初始化的完成,也就是構(gòu)造函數(shù)執(zhí)行的結(jié)束一定 happens-before它的finalize()方法。
這幾條規(guī)則就是面向我們這些開發(fā)人員的,掌握了這幾條規(guī)則能讓我們更好的開發(fā)出符合我們預(yù)期的并發(fā)程序的代碼!
“happens-before是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。