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