“請你說一下你對Happens-Before的理解” 你聽到這個問題的時候,知道怎麼回答嗎? 大家好,我是Mic,一個工作了14年的Java程式員。 併發編程是面試過程中重點考察的方向,能夠考察的方向有很多 關於這個問題,我把高手回答整理到了15W字的面試文檔裡面大家可以私信我領取 下麵看看高手的回 ...
“請你說一下你對Happens-Before的理解”
你聽到這個問題的時候,知道怎麼回答嗎?
大家好,我是Mic,一個工作了14年的Java程式員。
併發編程是面試過程中重點考察的方向,能夠考察的方向有很多
關於這個問題,我把高手回答整理到了15W字的面試文檔裡面大家可以私信我領取
下麵看看高手的回答。
高手:
首先,Happens-Before是一種可見性模型,也就是說,在多線程環境下。
原本因為指令重排序的存在會導致數據的可見性問題,也就是A線程修改某個共用變數
對B線程不可見。
因此,JMM通過Happens-Before關係向開發人員提供跨越線程的記憶體可見性保證。
如果一個操作的執行結果對另外一個操作可見,那麼這兩個操作之間必然存在Happens-Before管理。
其次,Happens-Before關係只是描述結果的可見性,並不表示指令執行的先後順序,也就是說只要不對結果產生影響,仍然允許指令的重排序。
最後,在JMM中存在很多的Happens-Before規則。
-
程式順序規則,一個線程中的每個操作,happens-before這個線程中的任意後續操作,可以簡單認為是as-if-serial也就是不管怎麼重排序,單線程的程式的執行結果不能改變
-
傳遞性規則,也就是A Happens-Before B,B Happens-Before C。
就可以推導出A Happens-Before C。
-
volatile變數規則,對一個volatile修飾的變數的寫一定happens-before於任意後續對這個volatile變數的讀操作
-
監視器鎖規則,一個線程對於一個鎖的釋放鎖操作,一定happens-before與後續線程對這個鎖的加鎖操作在這個場景中,如果線程A獲得了鎖並且把x修改成了12,那麼後續的線程獲得鎖之後得到的x的值一定是12。
-
線程啟動規則,如果線程A執行操作ThreadB.start(),那麼線程A的ThreadB.start()之前的操作happens-before線程B中的任意操作。
在這樣一個場景中,t1線程啟動之前對於x=10的賦值操作,t1線程啟動以後讀取x的值一定是10。
-
join規則,如果線程A執行操作ThreadB.join()併成功返回,那麼線程B中的任意操作happens-before於線程A從ThreadB.join()操作成功的返回。
總結
Happens-Before模型,在多線程開發中是必須要理解和掌握的規則。
它能夠指引開發者在使用多線程開發的時候避免出現記憶體可見性問題
因此這道面試題其實也是考察求職者的基礎能力
大家記得點贊收藏加關註!!!
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!