字節終面:被Java鎖的狀態難倒了,幸虧看了這個筆記

2020-09-03 Java日記本

分享一下自己去面字節的經歷,我自己本科是普通211,在小廠幹了剛滿兩年,但是感覺作為一個程式設計師還是要趁早去大廠,剛拿到字節Offer。因為同時在工作也沒時間系統複習,面試前主要突擊了一下並發編程那塊內容,沒想到都被問到了!

終面的時候問了我多線程+高並發+CAS+鎖+線程池底層。一般我們對鎖的種類都比較了解,沒想到字節終面問了一個問題:鎖有哪些狀態?都有哪些優缺點?要不是突擊準備的時候看了一下這一塊,還真有點答不全。

下面就分享一下我自己整理的關於鎖的狀態的知識點筆記!篇幅有限,如果想看完整個人面經、筆記梳理和Java架構資料分享(200+頁PDF),私信我就可以發給你哈~


1、概述

任何對象都有一個monitor與之關聯。同步代碼塊在編譯後會在開始位置插入monitorenter,在結束和異常處插入monitorexit,前者嘗試獲取對象的monitor。

對象的鎖信息,存在對象頭的mark word中。

在java1.6之前使用synchronized獲取和釋放鎖的開銷較大,性能比較差。為減少獲得和釋放鎖帶來的性能消耗引入偏向鎖和輕量級鎖,所以1.6及以後它的性能並不比lock差。

對象頭中鎖的狀態隨著競爭程度從低到高分為 無鎖狀態、偏向鎖狀態、輕量級鎖狀態、重量級鎖狀態。鎖的狀態只能升級不能降級。


2、偏向鎖狀態

線程獲取到鎖時,會在對象頭記錄鎖偏向的線程ID,後續進出同步塊不需要cas來加鎖和解鎖,只需測試頭裡面是否有指向當前線程的偏向鎖。其他線程嘗試cas替換偏向鎖的線程ID,成功則獲得偏向鎖,失敗則開始撤銷偏向鎖,暫停原持有偏向鎖的線程,若原線程已退出同步塊或未活動,則獲取成功,否則升級到輕量級鎖狀態。

優點:加鎖解鎖不需要額外消耗

缺點:存在競爭會帶來鎖撤銷的消耗;適用於只有一個線程進入同步塊的場景。


3、輕量級鎖狀態

執行同步塊之前拷貝mark word到棧幀的鎖記錄中,然後cas將對象頭的mark word替換為指向鎖記錄的指針,若成功則獲取到鎖,若失敗則自旋獲取鎖。自旋一定次數還沒獲取到鎖,升級為重量級鎖。釋放鎖時會cas把棧幀中的mark word替換回對象頭,成功表示沒有競爭,失敗則升級為重量級鎖,競爭線程會進入阻塞,當前線程會釋放鎖並喚醒等待線程。

優點:競爭線程不用阻塞,提高響應速度

缺點:一直獲取不到鎖,自旋會消耗cpu;適用於無實際競爭或偶爾有競爭,追求響應時間,同步塊執行很快的場景。


4、重量級鎖狀態

優點:競爭線程阻塞不會消耗cpu

缺點:線程阻塞相應慢;適用於有實際競爭,追求吞吐量,同步塊執行時間較長。


5、鎖各種狀態流轉圖:


看到這裡,你Get鎖狀態的知識點了嗎?


整理總結不易,如果覺得這篇文章有幫助的話,歡迎轉發、收藏,給我一些鼓勵~

有想看的內容或者建議,敬請留言!

最近利用空餘時間整理了一些精選Java架構學習視頻和大廠項目底層知識點,需要的同學歡迎私信我發給你~一起學習進步!有任何問題也歡迎交流~

Java日記本,每日存檔超實用的技術乾貨學習筆記,每天陪你前進一點點~

相關焦點

  • 熬夜整理了200頁Java筆記,雙非小廠員工拿下字節三面
    我的經歷8月20號終於拿到字節Offer了!作為本科雙非畢業,簡歷和項目經驗都不太過關,應屆秋招時大廠面試全掛了,只好先進小廠做後端「修煉」兩年。雖然因為疫情就業情景不是太好,我還是想去面一下大廠。我是那種基礎不是特別好、勤奮掛的人,好記性不如爛筆頭,面試前肝了兩周理了200多頁筆記。
  • 並發系列-徹底看清Java中的鎖
    這裡截取一張hotspot的源碼當中的注釋這張圖換成可讀的表格如下意思是java的對象頭在對象的不同狀態下會有不同的表現形式,主要有三種狀態,無鎖狀態、加鎖狀態、gc標記狀態。那麼我可以理解java當中的取鎖其實可以理解是給對象上鎖,也就是改變對象頭的狀態,如果上鎖成功則進入同步代碼塊。但是java當中的鎖有分為很多種,從上圖可以看出大體分為偏向鎖、輕量鎖、重量鎖三種鎖狀態。
  • Java並發鎖的原理,你所不知道的Java「鎖」事
    的對象頭在對象的不同狀態下會有不同的表現形式,主要有三種狀態,無鎖狀態、加鎖狀態、gc標記狀態。那麼我可以理解java當中的取鎖其實可以理解是給對象上鎖,也就是改變對象頭的狀態,如果上鎖成功則進入同步代碼塊。但是java當中的鎖有分為很多種,從上圖可以看出大體分為偏向鎖、輕量鎖、重量鎖三種鎖狀態。這三種鎖的效率完全不同、關於效率的分析會在下文分析,我們只有合理的設計代碼,才能合理的利用鎖、那麼這三種鎖的原理是什麼?所以我們需要先研究這個對象頭。
  • 面試阿里P6,卻被MySQL難倒,二戰阿里,擠進天貓團隊(Java崗)
    02 二戰阿里,天貓團隊面試題(3輪技術面+HR面)阿里面試技術題:自我介紹唄項目介紹唄(先自己介紹項目,然後再聊天)junit用法,before,beforeClass,after,afterClass
  • 九月最新的字節跳動Java面經(框架+線程+Redis等等)
    金九銀十到了,沒想到今天才第二天,就有朋友收到了字節的offer了。下面我給大家分享一下他碰到的面試題。供大家參考一下。java多態?java運行時數據區?作用?反射是什麼?怎麼用反射創建對象?好處?http協議有哪些組成,請求方式哪些?
  • 國慶臨近,字節後端開發3+4面,終於拿到秋招第一個offer
    字節跳動,先面了data部門,3面技術面之後hr說需要實習轉正,拒絕,之後另一個部門撈起,四面技術面,已oc分享面經,希望對大家有所幫助,秋招順利在文末分享了我為金九銀十準備的備戰資源庫,包含了源碼筆記類,大廠面試真題,跳槽解析,簡歷解析,項目實戰源碼+筆記+工具,有需要的可以直接轉發本文後,
  • 鎖2——JAVA成長之路
    任何對象都有一個monitor與之關聯,當且一個monitor被持有後,它將處於鎖定狀態。線程執行到monitorenter指令時,將會嘗試獲取對象所對應的monitor的所有權,即嘗試獲得對象的鎖。方法級的同步是隱式的, 即無須通過字節碼指令來控制, 它實現在方法調用和返回操作之中。虛擬機可以從方法常量池的方法表結構中的ACC_SYNCHRONIZED訪問標誌得知一個方法是否聲明為同步方法。
  • 阿里 字節 網易端JAVA後端面試經歷分享,已拿offer
    的學習,道阻且長當前面試情況:騰訊(一面掛)、美團(二面掛)、網易嚴選(成功)、杭州字節lark(口頭offer)、阿里新零售業務平臺(成功)、滴滴交易平臺(HR面) 麵筋總結:(字節一面這個問題給我問懵了)7. 接口和抽象類區別8. 重寫和重載的區別9.
  • Java崗四面拿到了阿里Offer,卻選擇了字節跳動(面試真題分享)
    了解雲計算麼,了解雲容器docker麼,容器和虛擬機的區別阿里二面說一下你對哪個項目比較熟悉、為什麼做這個項目項目採用了什麼架構,資料庫如何設計的資料庫有哪些表,為什麼有這些表說下你平時看的一些技術博客,書籍。
  • 複習一周,字節跳動三場技術面+HR面,不小心拿了offer
    反問先別走,二面面試官馬上來8.15 二面 (40min):自我介紹,為什麼投客戶端講講在學校的科研項目python和java最大的區別是什麼分布式鎖都可以怎麼實現?問點計算機基礎吧(終於)java代碼從編寫到運行的過程堆內存通過gc自動回收,棧內存怎麼回收?棧溢出是什麼?什麼場景可能會出現棧溢出?問點網絡吧,syn攻擊了解嗎?(以前刷博客看過一眼,只懂個皮毛,不過面試官很好,說如果不了解就不問這方面的內容了。
  • JVM系列之:對象的鎖狀態和同步
    為了實現這個功能,java對象又需要具備什麼樣的結構呢?快來一起看看吧。java對象頭Java的鎖狀態其實可以分為三種,分別是偏向鎖,輕量級鎖和重量級鎖。在Java HotSpot VM中,每個對象前面都有一個class指針和一個Mark Word。
  • 二本9面字節虐成渣,Java小菜鳥玩命復盤兩月,怒進阿里
    大家可以去投了」「看來字節跳動就是要定你了!」Java 中有哪些鎖?有什麼區別?Synchronized 鎖升級的原理是什麼?字節碼是什麼?字節碼增強有哪些?如何使用 Redis 實現分布式鎖?
  • 阿里Java二面:具備調優經驗?講下對Synchronized同步鎖的優化理解
    = new Object(); synchronized (o) { // code } }下面我們可以通過反編譯看下具體字節碼的實現,運行以下反編譯命令,就可以輸出我們想要的字節碼:javac -encoding UTF-8 SyncTest.java // 先運行編譯 class
  • 九面字節跳動,備戰刷題三個月拿到offer才知道算法太太重要了
    ,直到五月才開始準備找實習,但是那段時間大廠的春招基本都結束了,所以只能投字節跳動的日常實習,把自己的第一次面試獻給了字節,現在想想那時確實頭鐵,所以當時實習面試非常坎坷。(字節這麼缺人的麼,要反覆鞭屍我這個菜雞兒)然後就是第三輪面試,這時候因為已經有好幾輪字節面試的經驗了,所以發揮得比較順利,但是最後還是掛了當時第三輪結束後算是真正被發感謝信了,不過知道自己掛了的那天正好字節的提前批開始,然後想都沒想就投了提前批,再次證明我屬實頭鐵。最後就是提前批的一二三面,因為之前六次面試經驗刷得差不多了,所以就比較順利,拿到了後端研發的意向書。
  • 字節跳動Android三面面經+HR面+總結,已拿Offer
    之前也斷斷續續面試了幾家,有內推有自己投簡歷的,提前批投遞了字節頭條,掛在了終面,正式批又投了抖音,三面過了後沒多久就收到HR面,已拿到Offer。可以自己寫一個java.lang.Object類嗎,系統會加載哪一個 12. Java裡泛型的實現 13. 了解常見排序算法嗎,手寫一下快排 14.
  • 輕鬆看懂Java字節碼
    / 作者簡介 /長假轉眼間就這麼過去了,很高興又跟大家見面啦,也希望大家能趕快調整回日常工作的狀態。注意,本周六還是要上班的。本篇文章轉載自鹹魚不思議的博客,文章分享了如何解讀java字節碼,或許會對大家有一定的借鑑意義。
  • 當你的Java程序發生短暫的停頓,你想過這個可能嗎?
    所有涉及jvm停頓的邏輯基本上都和這個概念有關。簡單來說,safepoint可以理解成是在代碼執行過程中的一些特殊位置,當線程執行到這些位置的時候,說明虛擬機當前的狀態是安全的,如果有需要,可以在這個位置暫停,比如發生GC時,需要暫停所有活動線程,但是線程在這個時刻,還沒有執行到一個安全點,所以該線程應該繼續執行,到達下一個安全點的時候暫停,等待GC結束。
  • 阿里大牛:精心總結的「java虛擬機實踐筆記」祝你拿下p7崗
    所以說今年要想好好的生存下去的話,只能靠我們自己的真本事了,大家都知道阿里巴巴的在國內網際網路的地位吧,可以說阿里是很多網際網路從事者夢寐以求的地方吧,當然java是作為目前需求量最大的崗位之一,阿里對java方面的崗位需求也是不少的,大家可以看看。
  • 《深入理解Java虛擬機》:線程安全,兩種同步鎖實現
    線程安全定義當多個線程訪問一個對象時,如果不用考慮這些線程在運行時環境下的調度和交替執行,也不需要進行額外的同步,或者在調用方法進行任何其他的協調操作,調用這個對象的行為都可以獲得正確的結果,那這個對象就是線程安全的。
  • 最新整理知名大廠「字節跳動」3篇Java崗面試題
    嘔心瀝血整理出3篇java面試題資料,有幫助請麻煩記得點讚支持喲!java lock的實現,公平鎖、非公平鎖悲觀鎖和樂觀鎖,應用中的案例,mysql當中怎麼實現,java中的實現頭條二面Java 內存分配策略?多個線程同時請求內存,如何分配?