10W+ 面試題,happens-before 規則

業餘草發表於2019-03-06

點選上方“業餘草”,選擇“置頂公眾號”

第一時間獲取技術乾貨和業界資訊!


640?wx_fmt=png

640?wx_fmt=png


今年的面試情況,被很多人吐槽。可能是人數和難度都有所增加。


昨天還有網友私信我,說面試被問到 happens-before 規則,我該怎麼回答?這個說來話長,給他發了幾個連結,並推薦他看看《2019 Java 高併發學習路線圖和必會的 50 道面試題!》這個。


過來一會他,又來了,說網上的解釋我看不懂。能不能讓我通俗的給他講一下。


關於 happens-before 規則,我有一篇文章(非公眾號)靠自然搜尋已經達到 10w+ 的閱讀了。


640?wx_fmt=png


所以,就借這個時間給大家通俗的講一下 Happens-Before 吧。


happens-before 是從 JDK5 開始,java 使用新的 JSR -133 記憶體模型推出的一個規則。JSR-133 使用 happens-before 的概念來闡述操作之間的記憶體可見性。在 JMM 中,如果一個操作執行的結果需要對另一個操作可見,那麼這兩個操作之間必須要存在 happens-before 關係。這裡提到的兩個操作既可以是在一個執行緒之內,也可以是在不同執行緒之間。


與程式設計師密切相關的 happens-before 規則如下:


640


翻譯解釋如下:


  • 程式次序規則:一個執行緒內,按照程式碼順序,書寫在前面的操作 happens-before 於書寫在後面的操作;

  • 鎖定規則:一個 unLock 操作先行發生於後面對同一個鎖額 lock 操作;

  • volatile變數規則:對一個變數的寫操作先行發生於後面對這個變數的讀操作;

  • 傳遞規則:如果操作A先行發生於操作B,而操作B又先行發生於操作C,則可以得出操作A先行發生於操作C;

  • 執行緒啟動規則:Thread物件的start()方法先行發生於此執行緒的每個一個動作;

  • 執行緒中斷規則:對執行緒interrupt()方法的呼叫先行發生於被中斷執行緒的程式碼檢測到中斷事件的發生;

  • 執行緒終結規則:執行緒中所有的操作都先行發生於執行緒的終止檢測,我們可以通過Thread.join()方法結束、Thread.isAlive()的返回值手段檢測到執行緒已經終止執行;

  • 物件終結規則:一個物件的初始化完成先行發生於他的finalize()方法的開始;


需要注意的是,兩個操作之間具有 happens-before 關係,並不意味著前一個操作必須要在後一個操作之前執行!happens-before 僅僅要求前一個操作(執行的結果)對後一個操作可見,且前一個操作按順序排在第二個操作之前(the first is visible to and ordered before the second)。happens- before 的定義很微妙,它可以看作 java 記憶體模型中的一條規則。


如果還有疑問,請加我微訊號:xmtxtt,備註“進群”,進群共同討論學習吧!


640

10T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,GO等等。在公眾號內回覆對應關鍵字或框架名字,即可免費獲取!!

640?wx_fmt=png

 你再主動一點點 640?  我們就有故事了

相關文章