成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官超級喜歡問的 Synchronized 鎖

開發 前端
Synchronized鎖在面試當中難免會遇到,那么如何完美應對面試官角度刁鉆的問題就顯得尤為重要。阿巴阿巴以身作則,給大家貢獻面試經驗。

[[440858]]

前言

最近技術圈子里因log4j的漏洞炸開了鍋。

Synchronized鎖在面試當中難免會遇到,那么如何完美應對面試官角度刁鉆的問題就顯得尤為重要。阿巴阿巴以身作則,給大家貢獻面試經驗。

回家等通知

面試官: synchronized應該了解吧?講講。

阿巴阿巴: 嗯嗯,了解一些,synchronized是Java中的關鍵字,它的作用主要是用來同步,一般叫它同步鎖,一般可以用在方法上,以及代碼塊上。

阿巴阿巴: 用在方法上好像鎖的的對象,用在代碼塊上如果修飾的是對象則鎖的是對象,如果修飾的是類,那么鎖的是該類的所有對象。

面試官: 不錯,那synchronized可以用在構造方法上嗎?上鎖的過程你了解嗎?

阿巴阿巴: 嗯...這個...不太清楚。

面試官: 那可以講一下鎖的優化嗎?

阿巴阿巴: 嗯?鎖還有優化嗎?不是很清楚哦。

面試官: 好的,那今天先面到這里吧,你回去等我通知哈??

阿巴阿巴: 好的。

當場發offer

面試官: synchronized應該了解吧?講講。

阿巴阿巴: 嗯嗯,了解一些,synchronized是Java中的關鍵字,它的作用主要是用來同步,一般叫它同步鎖,一般可以用在實例方法上、靜態方法上以及代碼塊上,主要是維護一個狀態,這個狀態就是同一時刻,只能有一個線程去訪問synchronized修飾的方法或代碼塊。

阿巴阿巴: 用在實例方法上鎖的是調用該方法的對象,用在靜態方法上,鎖的是當前類的所有對象,用在代碼塊上如果修飾的是對象則鎖的是對象,如果修飾的是類,那么鎖的是該類的所有對象。(畫圖強化記憶)

  1. // synchronized用在靜態方法上 
  2. public synchronized static void test01() { 
  3.  
  4. // synchronized用在實例方法上 
  5. public synchronized void test02() { 
  6.  
  7. // synchronized用來修飾對象 
  8. public void test03() { 
  9.     synchronized (this) {} 
  10.  
  11. // synchronized用來修飾當前類 
  12. public void test04() { 
  13.     synchronized (TestSyn.class) {} 

面試官: 不錯,那synchronized可以用在構造方法上嗎?上鎖的過程你了解嗎?

阿巴阿巴: synchronized不能直接加在構造方法上,但是可以在構造方法里使用synchronized的代碼塊。

阿巴阿巴: 上鎖過程這里涉及到JDK版本問題,在JDK1.5及之前的話,synchronized關鍵字經過編譯之后,會在同步塊的前后分別形成monitorenter和monitorexit這倆個字節碼指令,在執行monitorenter指令的時候對象鎖(這個對象鎖包括對象實例或Class對象),如果說獲取的這個對象沒有被鎖定,或者說當前線程已經獲取到該對象的鎖了(synchronized是可重入鎖,即已經獲取到鎖的線程可以再次獲取鎖,而不需要再進行同步),那么就把鎖的計數器加1,

阿巴阿巴: 同樣,如果在執行monitorexit這個指令時,就把鎖的計數器減1,這樣當計數器的值為0時,鎖就被釋放了。倘若線程獲取對象鎖沒成功,那么就會一直阻塞等待直到鎖被釋放。

阿巴阿巴: synchronized重量級鎖的實現是由C++代碼實現的,其中有個ObjectMonitor隊列,下面展示下代碼中的重要屬性。

  1. ObjectMonitor() { 
  2.     _recursions   = 0;     //重入次數 
  3.     _owner        = NULL;  //指向持有ObjectMonitor對象的線程  
  4.     _WaitSet      = NULL;  //調用wait后,線程會被加入到_WaitSet,WaitSet是第一個節點 
  5.     _cxq          = NULL ; //多線程競爭鎖進入時的單向鏈表 
  6.     _EntryList    = NULL ; //等待獲取鎖的線程,會被加入到該列表,_EntryList是第一個節點 

阿巴阿巴: 下面是線程流動圖。

如上圖所示

0 當多個線程同時競爭時,那么這些線程會被放入到EntryList隊列,此時線程處于阻塞狀態

1 當一個線程獲取到了對象的monitor后,那么就可以進入運行狀態,這時候ObjectMonitor對象的/_owner指向當前線程,_count加1表示當前對象鎖被一個線程獲取。

2 當運行狀態的線程調用wait()方法,那么當前線程釋放monitor對象,進入等待狀態,ObjectMonitor對象的/_owner變為null,_count減1,同時線程進入_WaitSet隊列。

3 直到有線程調用notify()方法喚醒該線程,則該線程進入_EntryList隊列,競爭到鎖再進入_Owner區。

4 如果當前線程執行完畢,那么也釋放monitor對象,ObjectMonitor對象的/_owner變為null,_count減1。

阿巴阿巴: 而JDK 1.5版本之前的synchronized,每次加鎖都需要從用戶態(運行用戶程序)切換到內核態(運行操作系統程序、操作硬件等),這種切換對系統資源的消耗是巨大的,因此JDK 1.6版本對synchronized進行了優化,引入了下面這些概念

  • 自旋鎖
  • 自適應性自旋
  • 鎖消除
  • 鎖粗化
  • 偏向鎖
  • 輕量級鎖
  • 重量鎖

面試官: 愿聞其詳

阿巴阿巴: 自旋鎖的引入主要是因為大多數情況下,一個線程占用鎖的時間不會持續很長時間,如果有其他線程競爭,直接將競爭失敗的線程掛起再恢復,顯然這種消耗是巨大的,所以采用一種“觀望”的手段,即讓該線程稍做等待,看看這段時間內占有鎖的線程是否會釋放鎖,這就是自旋。

阿巴阿巴: 然而,自旋也沒能徹底解決該問題,需要考慮到占有鎖的線程對鎖的占用,如果占用過久那么就會導致自旋鎖一直做無用的自選操作,從而消耗CPU資源,因此設置一個自旋的次數閾值顯得尤為重要,這個閾值也需要設置成合適的值,不會過高也不會過低。

阿巴阿巴: 自適應自旋鎖的誕生。自適應的意思就是說自旋的次數或者時間不再固定了,而是由前一次在同一個鎖上的自旋的次數或者時間來決定:如果在同一個鎖對象上,自旋等待剛剛成功獲得過鎖,并且持有鎖的線程正在運行中,那么虛擬機就會認為這次自旋也很有可能再次成功,M某種意義上來說它將允許自旋等待持續相對更長的時間。相反的,如果自旋很少成功獲得過,那在以后要獲取這個鎖時將可能減少自旋時間、或次數,從而來避免浪費CPU資源。

阿巴阿巴: 鎖消除即在同步的代碼中分析發現無論如何都不會出現鎖的競爭,那么就可以將該鎖進行消除,這個分析被稱為逃逸分析,如果有一個段同步的代碼不會被其他線程所訪問到,那么這個同步也是無意義的。

阿巴阿巴: 鎖的粗化指的是如果一段代碼一直在不停的給一個對象進行加鎖、解鎖,比如在循環體中進行加鎖、解鎖操作,就算沒有線程競爭,也會產生巨大消耗的,對于這種情況可以考慮將鎖的范圍擴大,這個過程就是粗化。

阿巴阿巴: 偏向鎖在保證線程安全的情況下,其實不一定會有線程的競爭,也就是不一定會有互斥,如果一個鎖對象沒有其他沒有其他線程競爭,那么JVM會默認其為偏向鎖,偏向鎖默認只有第一個申請鎖的線程會使用鎖且不會有其他線程來競爭鎖,因此,只需要在Mark Word中CAS記錄owner,如果記錄更新成功,則偏向鎖獲取成功,記錄鎖狀態為偏向鎖,以后當前線程等于owner就可以零成本的直接獲得鎖;如果這時候有其他線程競爭,那么偏向鎖就會膨脹為輕量級鎖。

阿巴阿巴: 使用輕量級鎖時,不需要申請互斥量,僅僅將Mark Word中的部分字節CAS更新指向線程棧中的Lock Record,如果更新成功,則輕量級鎖獲取成功,記錄鎖狀態為輕量級鎖;輕量鎖適合于倆個線程交替運行,但是沒有產生實質上得競爭,如果發生了鎖競爭,接下來輕量鎖將膨脹為重量級鎖。

面試官: 講的很好,不錯,可以回去準備后面的面試了??。

阿巴阿巴: 好的。

 

本期面試到此結束,下期阿巴阿巴被問到了更難的對象頭和鎖相關的東西,期待她完美的表現吧!

 

責任編輯:武曉燕 來源: 程序員巴士
相關推薦

2021-11-08 09:18:01

CAS面試場景

2021-12-25 22:31:10

MarkWord面試synchronize

2021-12-02 18:20:25

算法垃圾回收

2024-01-11 08:12:20

重量級監視器

2022-01-05 08:56:20

Vue修飾符面試

2024-03-25 11:03:38

Vue修飾符lazy

2024-03-08 07:53:19

LockMonitor線程

2018-05-10 15:48:47

面試面試官Java

2025-06-03 07:05:00

Linux操作系統Windows

2021-01-06 05:36:25

拉鏈表數倉數據

2010-08-23 15:06:52

發問

2020-07-28 00:58:20

IP地址子網TCP

2022-01-05 09:55:26

asynawait前端

2024-08-12 17:36:54

2018-01-19 10:43:06

Java面試官volatile關鍵字

2021-04-21 09:28:17

字節面試官SetTimeout

2024-08-19 09:13:02

2023-11-10 08:44:13

分布式鎖分布式系統

2010-10-27 11:07:45

面試官

2022-06-10 13:56:42

Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线精品一区二区 | 中国一级特黄毛片大片 | 欧美13videosex性极品 | 国产精品九九 | 在线一区视频 | 麻豆久久久久 | 粉嫩高清一区二区三区 | 日韩欧美亚洲一区 | 日韩一区二区三区视频在线播放 | 视频在线一区二区 | 日韩成人在线视频 | 久久久久久久久久久国产 | 午夜寂寞福利视频 | 黄色大片免费观看 | 成人亚洲视频 | 在线免费观看毛片 | 91大神在线看 | 99久久国产 | 在线播放中文字幕 | 一级片片 | 免费一级黄色 | www.婷婷亚洲基地 | 成人一区精品 | av av在线 | 日韩精品久久一区二区三区 | 成人二区 | 精品国产区 | 亚洲最新在线视频 | 激情的网站 | 美国一级片在线观看 | 久久久久久国产精品 | 国产成人精品区一区二区不卡 | 国产乱码精品1区2区3区 | 国产乱码精品一区二区三区中文 | 免费的日批视频 | 精品国产欧美一区二区三区成人 | 超碰一区二区 | 在线免费观看黄视频 | 国产欧美一区二区三区在线看 | 北条麻妃视频在线观看 | 四虎永久免费黄色影片 |