AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Java中的鎖升級機制:偏向鎖、輕量級鎖和重量級鎖

來源: 責(zé)編: 時間:2024-03-18 17:41:41 185觀看
導(dǎo)讀Monitor實現(xiàn)的鎖屬于重量級鎖,你了解過鎖升級嗎?前面我們說了 synchronized 底層由monitor實現(xiàn)的,它那 synchronized 到底鎖的是什么呢?隨著 JDK 版本的升級,synchronized 又做出了哪些改變呢?“synchronized 性能很差”的

Monitor實現(xiàn)的鎖屬于重量級鎖,你了解過鎖升級嗎?L1R28資訊網(wǎng)——每日最新資訊28at.com

前面我們說了  synchronized 底層由monitor實現(xiàn)的,它那 synchronized 到底鎖的是什么呢?隨著 JDK 版本的升級,synchronized 又做出了哪些改變呢?“synchronized 性能很差”的謠言真的存在嗎?L1R28資訊網(wǎng)——每日最新資訊28at.com

在介紹以上內(nèi)容之前,我們要先知道重量級鎖概念。L1R28資訊網(wǎng)——每日最新資訊28at.com

重量級鎖

當(dāng)另外一個線程執(zhí)行到同步塊的時候,由于它沒有對應(yīng) monitor 的所有權(quán),就會被阻塞,此時控制權(quán)只能交給操作系統(tǒng),也就會從 user mode 切換到 kernel mode, 由操作系統(tǒng)來負(fù)責(zé)線程間的調(diào)度和線程的狀態(tài)變更, 這就需要頻繁的在這兩個模式下切換(上下文轉(zhuǎn)換)。有點競爭就找內(nèi)核的行為很不好,會引起很大的開銷,所以大家都叫它重量級鎖,自然效率也很低,這也就給很多小伙伴留下了一個印象 —— synchronized 關(guān)鍵字相比于其他同步機制性能不好,但其實不然。L1R28資訊網(wǎng)——每日最新資訊28at.com

  • Monitor實現(xiàn)的鎖屬于重量級鎖,里面涉及到了用戶態(tài)和內(nèi)核態(tài)的切換、進(jìn)程的上下文切換,成本較高,性能比較低。
  • 在JDK 1.6引入了兩種新型鎖機制:偏向鎖和輕量級鎖,它們的引入是為了解決在沒有多線程競爭或基本沒有競爭的場景下因使用傳統(tǒng)鎖機制帶來的性能開銷問題。

一、MarkWord

在JVM虛擬機中,對象在內(nèi)存中存儲的布局可分為3塊區(qū)域:對象頭(Header)、實例數(shù)據(jù)(Instance Data)和對齊填充。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

我們需要重點分析MarkWord對象頭,因為Markword 是保存鎖狀態(tài)的關(guān)鍵,對象鎖狀態(tài)可以從偏向鎖升級到輕量級鎖,再升級到重量級鎖,加上初始的無鎖狀態(tài),可以理解為有 4 種狀態(tài)。想在一個對象中表示這么多信息自然就要用位來存儲。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

  • hashcode:25位的對象標(biāo)識Hash碼
  • age:對象分代年齡占4位
  • biased_lock:偏向鎖標(biāo)識,占1位 ,0表示沒有開始偏向鎖,1表示開啟了偏向鎖

thread:持有偏向鎖的線程ID,占23位L1R28資訊網(wǎng)——每日最新資訊28at.com

  • epoch:偏向時間戳,占2位
  • ptr_to_lock_record:輕量級鎖狀態(tài)下,指向棧中鎖記錄的指針,占30位
  • ptr_to_heavyweight_monitor:重量級鎖狀態(tài)下,指向?qū)ο蟊O(jiān)視器Monitor的指針,占30位

我們可以通過lock的標(biāo)識,來判斷是哪一種鎖的等級L1R28資訊網(wǎng)——每日最新資訊28at.com

  • 后三位是001表示無鎖
  • 后三位是101表示偏向鎖
  • 后兩位是00表示輕量級鎖
  • 后兩位是10表示重量級鎖

二、輕量級鎖

在很多的情況下,在Java程序運行時,同步塊中的代碼都是不存在競爭的,不同的線程交替的執(zhí)行同步塊中的代碼。這種情況下,用重量級鎖是沒必要的。因此JVM引入了輕量級鎖的概念。L1R28資訊網(wǎng)——每日最新資訊28at.com

如果 CPU 通過 CAS(后面會細(xì)講,戳鏈接直達(dá))就能處理好加鎖/釋放鎖,這樣就不會有上下文的切換。L1R28資訊網(wǎng)——每日最新資訊28at.com

但是當(dāng)競爭很激烈,CAS 嘗試再多也是浪費 CPU,權(quán)衡一下,不如升級成重量級鎖,阻塞線程排隊競爭,也就有了輕量級鎖升級成重量級鎖的過程。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

作為程序員的我們最喜歡用代碼說話,貼心的 openjdk 官網(wǎng)提供了可以查看對象內(nèi)存布局的工具 JOL (java object layout),我們直接通過 Maven 引入到項目中。L1R28資訊網(wǎng)——每日最新資訊28at.com

<dependency>      <groupId>org.openjdk.jol</groupId>      <artifactId>jol-core</artifactId>      <version>0.14</version>  </dependency>
public class SyncSample {    private static Object LOCK = new Object();    public static void main(String[] args) {        System.out.println("----------未進(jìn)入同步塊,MarkWord 為:----------");        System.out.println(ClassLayout.parseInstance(LOCK).toPrintable());        synchronized (LOCK) {            System.out.println("----------進(jìn)入同步塊,MarkWord 為:----------");            System.out.println(ClassLayout.parseInstance(LOCK).toPrintable());        }    }}

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

2.1 加鎖流程

1.在線程棧中創(chuàng)建一個Lock Record,將其obj字段指向鎖對象。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

2.通過CAS指令將Lock Record的地址存儲在對象頭的mark word中(數(shù)據(jù)進(jìn)行交換),如果對象處于無鎖狀態(tài)則修改成功,代表該線程獲得了輕量級鎖。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

3.如果是當(dāng)前線程已經(jīng)持有該鎖了,代表這是一次鎖重入。設(shè)置Lock Record第一部分為null,起到了一個重入計數(shù)器的作用。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

4.如果CAS修改失敗,說明發(fā)生了競爭,需要膨脹為重量級鎖。L1R28資訊網(wǎng)——每日最新資訊28at.com

2.2 解鎖流程

1.遍歷線程棧,找到所有obj字段等于當(dāng)前鎖對象的Lock Record。L1R28資訊網(wǎng)——每日最新資訊28at.com

2.如果Lock Record的Mark Word為null,代表這是一次重入,將obj設(shè)置為null后continue。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

3.如果Lock Record的 Mark Word不為null,則利用CAS指令將對象頭的mark word恢復(fù)成為無鎖狀態(tài)。如果失敗則膨脹為重量級鎖。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

三、偏向鎖

輕量級鎖在沒有競爭時(就自己這個線程),每次重入仍然需要執(zhí)行 CAS 操作。Java 6 中引入了偏向鎖來做進(jìn)一步優(yōu)化:只有第一次使用 CAS 將線程 ID 設(shè)置到對象的 Mark Word 頭,之后發(fā)現(xiàn)這個線程 ID 是自己的就表示沒有競爭,不用重新 CAS。以后只要不發(fā)生競爭,這個對象就歸該線程所有。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

可是多線程環(huán)境,也不可能只有同一個線程一直獲取這個鎖,其他線程也是要干活的,如果出現(xiàn)多個線程競爭的情況,就會有偏向鎖升級的過程。L1R28資訊網(wǎng)——每日最新資訊28at.com

1.在線程棧中創(chuàng)建一個Lock Record,將其obj字段指向鎖對象。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

2.通過CAS指令將Lock Record的線程id存儲在對象頭的mark word中,同時也設(shè)置偏向鎖的標(biāo)識為101,如果對象處于無鎖狀態(tài)則修改成功,代表該線程獲得了偏向鎖。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

3.如果是當(dāng)前線程已經(jīng)持有該鎖了,代表這是一次鎖重入。設(shè)置Lock Record第一部分為null,起到了一個重入計數(shù)器的作用。與輕量級鎖不同的時,這里不會再次進(jìn)行cas操作,只是判斷對象頭中的線程id是否是自己,因為缺少了cas操作,性能相對輕量級鎖更好一些。L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

思考:偏向鎖可以繞過輕量級鎖,直接升級到重量級鎖嗎?L1R28資訊網(wǎng)——每日最新資訊28at.com

圖片L1R28資訊網(wǎng)——每日最新資訊28at.com

四、面試題

面試官:Monitor實現(xiàn)的鎖屬于重量級鎖,你了解過鎖升級嗎?L1R28資訊網(wǎng)——每日最新資訊28at.com

Java中的synchronized有無鎖(無鎖就是沒有對資源進(jìn)行鎖定,任何線程都可以嘗試去修改它)、偏向鎖、輕量級鎖、重量級鎖四種形式,偏向鎖、輕量級鎖、重量級鎖分別對應(yīng)了鎖只被一個線程持有、不同線程交替持有鎖、多線程競爭鎖三種情況L1R28資訊網(wǎng)——每日最新資訊28at.com

鎖別L1R28資訊網(wǎng)——每日最新資訊28at.com

描述L1R28資訊網(wǎng)——每日最新資訊28at.com

重量級鎖L1R28資訊網(wǎng)——每日最新資訊28at.com

底層使用的Monitor實現(xiàn),里面涉及到了用戶態(tài)和內(nèi)核態(tài)的切換、進(jìn)程的上下文切換,成本較高,性能比較低。L1R28資訊網(wǎng)——每日最新資訊28at.com

輕量級鎖L1R28資訊網(wǎng)——每日最新資訊28at.com

線程加鎖的時間是錯開的(也就是沒有競爭),可以使用輕量級鎖來優(yōu)化。輕量級修改了對象頭的鎖標(biāo)志,相對重量級鎖性能提升很多。每次修改都是CAS操作,保證原子性L1R28資訊網(wǎng)——每日最新資訊28at.com

偏向鎖L1R28資訊網(wǎng)——每日最新資訊28at.com

一段很長的時間內(nèi)都只被一個線程使用鎖,可以使用了偏向鎖,在第一次獲得鎖時,會有一個CAS操作,之后該線程再獲取鎖,只需要判斷mark  word中是否是自己的線程id即可,而不是開銷相對較大的CAS命令L1R28資訊網(wǎng)——每日最新資訊28at.com


L1R28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-77523-0.htmlJava中的鎖升級機制:偏向鎖、輕量級鎖和重量級鎖

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 面試官:SpringBoot如何優(yōu)雅停機?

下一篇: CSS 實現(xiàn)居左到居右過渡變化的一些思路

標(biāo)簽:
  • 熱門焦點
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時代已經(jīng)過去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗平板電腦生存的環(huán)境來了。也就是面對著這種殘酷的
  • 石頭自清潔掃拖機器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經(jīng)常能看到一個詞叫“縫合怪”,用來形容那些把好多功能或者外觀結(jié)合在一起的產(chǎn)品,通常這樣的詞是貶義詞,但如果真的是產(chǎn)品縫合的好、縫合的實用的話,那它就成了中性詞,今
  • 5月安卓手機好評榜:魅族20 Pro奪冠

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數(shù)據(jù)來源安兔兔評測,收集時間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評率:97.50%不得不感慨魅族老品牌還
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機將會在第三季度上市,如今隨著時間臨近,新機的各種消息也開始浮出水面。據(jù)悉,這款新機將會被命名為&ldquo;On
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學(xué)習(xí)反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進(jìn)行反混淆,尤其是使用自定義混淆器對其進(jìn)行混淆時。什么是混
  • 企業(yè)采用CRM系統(tǒng)的11個好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規(guī)模如今超過580
  • WebRTC.Net庫開發(fā)進(jìn)階,教你實現(xiàn)屏幕共享和多路復(fù)用!

    WebRTC.Net庫:讓你的應(yīng)用更親民友好,實現(xiàn)視頻通話無痛接入! 除了基本用法外,還有一些進(jìn)階用法可以更好地利用該庫。自定義 STUN/TURN 服務(wù)器配置WebRTC.Net 默認(rèn)使用 Google 的
  • 中國家電海外掘金正當(dāng)時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場戰(zhàn)況空前,中國創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • AI芯片初創(chuàng)公司Tenstorrent獲三星和現(xiàn)代1億美元投資

    Tenstorrent是一家由芯片行業(yè)資深人士Jim Keller領(lǐng)導(dǎo)的加拿大初創(chuàng)公司,專注于開發(fā)人工智能芯片,該公司周三表示,已經(jīng)從現(xiàn)代汽車集團(tuán)和三星投資基金等
Top