面試官為什麼總是問happens-before規則,看完這篇文章你就懂了

2020-12-13 Java讀書筆記

本篇文章從happens-before定義、用途以及具體規則三個方面對happens-before進行解讀,並通過源碼案例深入了解為什麼需要happens-before規則和什麼是指令重排序。

什麼是happens-before

happens-before:A happens-before B就是A先行發生於B(這種說法不是很準確),定義為hb(A, B)。在Java內存模型中,happens-before的意思是前一個操作的結果可以被後續操作獲取。

為什麼需要happens-before

JVM會對代碼進行編譯優化,會出現指令重排序情況,為了避免編譯優化對並發編程安全性的影響,需要happens-before規則定義一些禁止編譯優化的場景,保證並發編程的正確性。以雙重檢查單例示例進行分析:

上述代碼中instance = new LazyDoubleCheckSingleton()並不是原子操作 ,JVM會分解成以下幾個命令執行:

給對象分配內容初始化對象將初始化對象和內存地址建立關聯按照上面的分解順序(1->2->3)執行不存在任何問題,但是由於JVM編譯優化的存在,可能導致2和3步驟顛倒,即按1->3->2順序執行(這就是指令重排序)。按照1->3->2順序執行,在多線程環境中執行getInstance就有可能出現instance已經和初始對象內存建立關聯,但是對象還沒有初始化完成的情況,即執行if (instance == null)的時候instance != null 直接返回沒有初始化完成的instance,導致再使用instance實例的時候報錯。volatile關鍵字是可以解決指令重排序問題的一種方式,具體解決方式如下:

有哪些happens-before規則

程序次序規則:在一個線程內一段代碼的執行結果是有序的。就是還會指令重排,但是隨便它怎麼排,結果是按照我們代碼的順序生成的不會變。管程鎖定規則:就是無論是在單線程環境還是多線程環境,對於同一個鎖來說,一個線程對這個鎖解鎖之後,另一個線程獲取了這個鎖都能看到前一個線程的操作結果!(管程是一種通用的同步原語,synchronized就是管程的實現)volatile變量規則:就是如果一個線程先去寫一個volatile變量,然後一個線程去讀這個變量,那麼這個寫操作的結果一定對讀的這個線程可見。線程啟動規則:在主線程A執行過程中,啟動子線程B,那麼線程A在啟動子線程B之前對共享變量的修改結果對線程B可見。線程終止規則:在主線程A執行過程中,子線程B終止,那麼線程B在終止之前對共享變量的修改結果在線程A中可見。也稱線程join()規則。線程中斷規則:對線程interrupt()方法的調用先行發生於被中斷線程代碼檢測到中斷事件的發生,可以通過Thread.interrupted()檢測到是否發生中斷。傳遞性規則:這個簡單的,就是happens-before原則具有傳遞性,即hb(A, B) , hb(B, C),那麼hb(A, C)。對象終結規則:這個也簡單的,就是一個對象的初始化的完成,也就是構造函數執行的結束一定 happens-before它的finalize()方法。END

筆者是一位熱愛網際網路、熱愛網際網路技術、熱於分享的年輕人,如果您跟我一樣,我願意成為您的朋友,分享每一個有價值的知識給您。喜歡作者的同學,點讚+轉發+關注哦!

相關焦點

  • 面試官:談談happens-before?
    Java內存模型中的happens-before是什麼?為什麼會有這東西的存在?其實我們學習的初期或者時間很急迫的時候我們都是死記硬背,沒有理解這東西背後的含義和為什麼需要這東西。我們再來看看為什麼需要這幾條規則?因為我們現在電腦都是多CPU,並且都有緩存,導致多線程直接的可見性問題。詳情可以看我之前的文章
  • 面試官:你知道happens-before規則嗎
    A happens-before BB happens-before CA happens-before C在上面三個happens-before中,2和3是必需的,但是1是不必要。JMM對重排序採取的策略最後附上happens-before的規則,面試的時候可能會問到。
  • 從底層原理深度剖析volatile關鍵字,徹底徵服面試官
    本篇文章從底層原理層面深度剖析volatile關鍵字是如何實現內存可見性的,同時引入了Java內存模型、指令重排序以及內存屏障等知識點作為原理分析的知識支撐。閱讀本文之前,推薦大家先閱讀作者之前的一篇關於happens-before的文章,這樣更有助於大家對volatile關鍵字底層原理的理解。
  • 為什麼會有重排序?和 happens-before 有什麼關係
    你可能會不假思索的告訴我,不是 ( 0 , 1 ) 就是 ( 2 , 0 ) ,這需要看我的 main 方法先執行哪個 method 方法。不錯,如果這個程序跑在了單線程上面,這樣回答一點兒毛病都沒有。但是,如果是在多線程環境下呢?
  • 面試中常會問到的Java內存模型原理,看了這篇秒懂
    這篇文章主要介紹模型產生的問題背景,解決的問題,處理思路,相關實現規則,環環相扣,希望讀者看完這篇文章後能對 Java 內存模型體系產生一個相對清晰的理解,知其然知其所以然。內存模型產生背景在介紹 Java 內存模型之前,我們先了解一下物理計算機中的並發問題,理解這些問題可以搞清楚內存模型產生的背景。
  • 我和面試官的博弈:Java 並發編程篇
    面試官:給你看下面一段代碼,你說下會存在加鎖的操作嗎?面試官:再看一段代碼,分析一下是在什麼地方加鎖的?面試官:那你說下Java內存模型的happens-before規則?我:在JMM中,如果一個操作執行的結果需要對另一個操作可見,那麼這兩個操作之間必須存在happens-before關係。
  • 求職面試篇:面試官都會問哪些問題
    說明:此類文章沒有合適圖片配圖,但是純文本閱讀又比較累,所以給大家放一些風景圖,緩解閱讀疲勞!(圖片主要來自暱圖網,圖行天下等)面試的時候,面試官拷問問題是不可避免的,所以,回答問題是重要的一環。如果在網上搜集一下就會發現,面試官問的很多問題,有一些問題是具有共同性的。
  • 大學生求職面試篇:面試官都會問哪些問題
    一、 針對簡歷的提問準備前面我們在《大學生初入職場如何寫一份優秀的簡歷(簡歷系列1/3篇)》這篇文章中,介紹了一份簡歷需要具備的最基本的要素,比如基本信息、求職意向、工作經歷、教育經歷、項目經歷、職業技能、
  • 面試官為什麼要問你離職的原因?不懂這3點規則,那就別亂說
    面試官為什麼要問你離職的原因?不懂這3點規則,那就別亂說想要在職場混跡,那就必須懂得如何去應付,一個真正有情商的人,往往更容易獲得成功,站上巔峰。職場並不好混,相信很多朋友都明白。想要進入職場,第一個要經歷的就是面試。如果連面試的第一關都通過不過,那麼也就不用再談其他的了。很多職場小白,或者是應屆畢業生都不知道面試時的一些規矩。有些話該說,有些話不該說,必須得明白。否則,最終很可能會因此被刷掉。就例如,面試官為什麼要問你離職的原因?有想過嗎?如果不懂這3點規則,那就別亂說,到時候悔之晚矣。
  • 為什麼面試完,總是讓你回去等通知?
    能點進來看的朋友,相信你們都應該有過同樣的經歷,那就是為什麼面試之後,面試官總讓你回去等通知,而這一等就是遙遙無期……有時候是自己沒發揮好,回去等通知就心裡有一半預期是沒戲了,有時候感覺非常良好,為什麼還是讓你回去等通知呢?今天,棧長帶你來分析一下這其中的厲害關係,面試官讓你回去等通知無非有以下幾種情況。
  • 醬香酒為什麼賣這麼貴?看完這篇文章你就懂了!
    醬香酒為什麼賣這麼貴?看完這篇文章你就懂了!不經常喝酒的人估計會發出這樣的疑問,同樣是白酒,為什麼普通的醬香白酒都要比市面上的其他白酒貴出很多。然而,當你了解了醬香酒的釀造過程後,你就明白了。說到醬香酒,你首先想到的一定是茅臺鎮,只有茅臺鎮釀出來的酒才叫純正醬香酒。以前茅臺酒公司曾經帶著最好的釀酒工程師和設備到異地釀酒,釀出來的味道就是不如在茅臺鎮釀的,為什麼呢?因為茅臺鎮幾百年來的釀酒歷史,使得茅臺鎮擁有了獨特的微生物群,利於醬酒發酵,這是別的地方模仿不來的。
  • 面試完後,要不要給面試官打電話問面試結果?
    我有一個朋友就因為面試完一周後給面試官打了個電話,最後拿到了工作。 過程其實是這樣的:我的朋友電話面試完了之後,等了一個星期,沒有任何通知(這個公司屬於中小型企業,沒有招聘官網可以看面試結果)。 心想可能是掛了,但是不甘心,就禮貌地打電話過去問了一下面試的結果,簡單地又表達了一下對於進入這家公司的渴望。
  • 面試時,面試官問你為什麼離職,聰明人的回答錦上添花
    面試時,面試官問你為什麼離職,聰明人的回答錦上添花我們在找工作的時候經常經歷面試這個環節,面試並不是一個非常簡單的流程。有些公司在面試的時候對於面試者有著很高的要求。可能開始會在面試的前面環節對你表現很滿意,但是後面就會突然提一個比較難回答的問題。有時候這個問題看起來並不是一個很難的問題,但是當你去回答的時候你就會猛然發現這個問題其實有著更深層的意義。
  • 【面試英文】面試中,不要問面試官這些問題
    面試結束時間,幾乎所有的招聘單位都會問應聘者這麼一個問題:你有問題要問我嗎?應聘人員應該像回答面試官問題一樣,要儘可能地多花些精力去思考去詢問對方的問題。無論願意與否,你所要問的每一個問題都可能會反映出你對招聘單位的了解,你對所面試崗位的興趣,以及你個人的職業道德。
  • 裸辭後,面試官問「你為什麼離職」時,實際上是在問什麼?
    裸辭後,面試官問「你為什麼離職」時,實際上是在問什麼?當我們在一家公司吃力不討好的時候,那麼腦海中第一個想法就是辭職吧。而如果你裸辭了之後,也就會尋找更合適自己的公司與職業崗位,那麼面試官肯定會詢問你關於你之前為何要離開上一家公司的原因。但是,如果深度剖析這個問題,那麼這個問題的本質到底是什麼?
  • 面試完後,該不該給面試官打電話詢問面試效果?
    其實有的時候,面試的考察,一直持續到面試結束之後,所以打不打電話給面試官這個事,也並不是絕對的哈。01我有一個朋友就因為面試完一周後給面試官打了個電話,最後拿到了工作。過程其實是這樣的:我的朋友電話面試完了之後,等了一個星期,沒有任何通知(這個公司屬於中小型企業,沒有招聘官網可以看面試結果)。
  • 面試官問:「用一句話告訴我為什麼要選擇你?」怎麼回答不送命
    小張昨天剛參加完一個面試,看的心情比較低落,看來面試的效果不怎麼好,於是我問他,你給我講講面試的經過,我幫你分析下。小張開始講面試的經過,剛開始面試的不錯,可是問完其中得一個項目經歷,這是小張擅長的項目,於是答的比較多,可能不對面試官的胃口,面試官有點無精打採,然後面試官問:「用一句話告訴我為什麼要選擇你?」
  • 《令人心動的offer》面試篇:當對方問你想來嗎?不要猶豫拒絕!
    前段時間,推送了《令人心動的offer》簡歷篇,今天給大家介紹《令人心動的offer》的面試篇。 面試部分讓我印象特別深刻的是賀鑫磊和詹秋怡,面對面試官的問題的回答,她們表現差別很大,尤其是兩個人對求職崗位的渴求程度,完全不一樣,前者猶豫,後者堅決。
  • 面試官問你的優點是什麼,應該如何回答?
    之前我寫過一篇「你的缺點是什麼?」的文章,但是沒有通過審核,我把如何回答這一問題總結了一個公司,補充在了文章尾部評論區,建議大家看一看。你的優點是什麼?」這是展示自身價值的一個問題,是面試中最常出現,最重要的問題之一。即使這個問題在面試中沒有被問到,你也必須對你自身的優點有清晰的認識,在日常的工作中發揚光大,成為你職業生涯中升職加薪的資本。想要這個問題為你的面試加分,我們要知道面試官為什麼要問這個問題?
  • 面試官:你還有什麼要問我的嗎?這樣回答讓你脫穎而出!
    當我們在平時參加面試的時候,在面試過程當中,面試官總會對我們說一句,你還有什麼問題要問呢?其實就是這麼一個簡單的問題,面試官就可以問出很多的東西,同時這個問題也暗藏很多的玄機。之所以聊這個問題,是因為我們公司HR前幾天面試了幾個新人,在面試的過程中,發現新人有一個共性問題,最後面試官問「還沒有問題問他」時,他們一致的回答是:「沒有了」或是「公司包一日三餐嗎?」這等無關痛癢的回答。而這樣的人第二天收到通知基本都是不合適,在面試的時候沉默,或者回答「沒有」的面試者。在面試時,通常處於下風。