日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

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

Monitor實現的鎖屬于重量級鎖,你了解過鎖升級嗎?LEy28資訊網——每日最新資訊28at.com

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

在介紹以上內容之前,我們要先知道重量級鎖概念。LEy28資訊網——每日最新資訊28at.com

重量級鎖

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

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

一、MarkWord

在JVM虛擬機中,對象在內存中存儲的布局可分為3塊區域:對象頭(Header)、實例數據(Instance Data)和對齊填充。LEy28資訊網——每日最新資訊28at.com

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

thread:持有偏向鎖的線程ID,占23位LEy28資訊網——每日最新資訊28at.com

  • epoch:偏向時間戳,占2位
  • ptr_to_lock_record:輕量級鎖狀態下,指向棧中鎖記錄的指針,占30位
  • ptr_to_heavyweight_monitor:重量級鎖狀態下,指向對象監視器Monitor的指針,占30位

我們可以通過lock的標識,來判斷是哪一種鎖的等級LEy28資訊網——每日最新資訊28at.com

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

二、輕量級鎖

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

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

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

作為程序員的我們最喜歡用代碼說話,貼心的 openjdk 官網提供了可以查看對象內存布局的工具 JOL (java object layout),我們直接通過 Maven 引入到項目中。LEy28資訊網——每日最新資訊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("----------未進入同步塊,MarkWord 為:----------");        System.out.println(ClassLayout.parseInstance(LOCK).toPrintable());        synchronized (LOCK) {            System.out.println("----------進入同步塊,MarkWord 為:----------");            System.out.println(ClassLayout.parseInstance(LOCK).toPrintable());        }    }}

圖片圖片LEy28資訊網——每日最新資訊28at.com

2.1 加鎖流程

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

3.如果是當前線程已經持有該鎖了,代表這是一次鎖重入。設置Lock Record第一部分為null,起到了一個重入計數器的作用。LEy28資訊網——每日最新資訊28at.com

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

2.2 解鎖流程

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

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

三、偏向鎖

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

圖片圖片LEy28資訊網——每日最新資訊28at.com

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

圖片LEy28資訊網——每日最新資訊28at.com

四、面試題

面試官:Monitor實現的鎖屬于重量級鎖,你了解過鎖升級嗎?LEy28資訊網——每日最新資訊28at.com

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

鎖別LEy28資訊網——每日最新資訊28at.com

描述LEy28資訊網——每日最新資訊28at.com

重量級鎖LEy28資訊網——每日最新資訊28at.com

底層使用的Monitor實現,里面涉及到了用戶態和內核態的切換、進程的上下文切換,成本較高,性能比較低。LEy28資訊網——每日最新資訊28at.com

輕量級鎖LEy28資訊網——每日最新資訊28at.com

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

偏向鎖LEy28資訊網——每日最新資訊28at.com

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


LEy28資訊網——每日最新資訊28at.com

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

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

上一篇: 面試官:SpringBoot如何優雅停機?

下一篇: CSS 實現居左到居右過渡變化的一些思路

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
免费av成人在线| 亚洲黄色影院| 国产精品毛片在线| 国产伦精品一区二区三区高清| 国产精品社区| 激情五月婷婷综合| 亚洲精品一区在线观看| 亚洲图色在线| 欧美在线视频免费| 欧美成人日本| 欧美日韩亚洲成人| 国产欧美日本在线| 亚洲福利视频三区| 亚洲视频每日更新| 久久精品亚洲一区二区三区浴池| 欧美成人精品在线观看| 国产精品久久久久久五月尺| 黄网动漫久久久| 一区二区三区日韩欧美| 久久精品欧美| 欧美视频官网| 亚洲大胆人体在线| 亚洲自拍电影| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲免费网站| 麻豆成人综合网| 国产精品国产三级国产普通话蜜臀 | 欧美在线免费播放| 欧美精品久久久久久| 国产欧美一区二区三区视频| 最新中文字幕亚洲| 久久超碰97中文字幕| 欧美日韩一区二区三区在线 | 亚洲一区二区三区在线播放| 老司机免费视频久久| 国产精品手机视频| 亚洲国产精品高清久久久| 亚洲欧美日韩视频一区| 欧美金8天国| 红桃视频国产精品| 亚洲欧美国产毛片在线| 欧美精品国产精品日韩精品| 国产中文一区二区三区| 亚洲一区国产精品| 欧美日韩国产天堂| 亚洲国产精品一区二区www在线| 欧美一级久久| 国产精品高潮视频| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲欧美在线免费观看| 欧美日本中文字幕| 亚洲大片一区二区三区| 欧美中日韩免费视频| 国产精品久久久久毛片大屁完整版 | 日韩一级免费| 欧美a级一区二区| 狠狠色狠狠色综合日日五| 亚洲欧美日韩在线一区| 欧美视频在线一区二区三区| 亚洲日本精品国产第一区| 久久人人爽人人爽爽久久| 国产精品系列在线| 亚洲网站啪啪| 欧美日韩亚洲视频| 亚洲精品国产欧美| 女人天堂亚洲aⅴ在线观看| 国产综合色一区二区三区| 午夜精品国产更新| 国产精品伦一区| 正在播放欧美一区| 欧美日韩久久| 日韩视频在线观看一区二区| 欧美~级网站不卡| 在线播放豆国产99亚洲| 久久深夜福利| 伊人影院久久| 另类春色校园亚洲| 在线精品视频一区二区| 久久免费少妇高潮久久精品99| 国产欧美日韩视频一区二区三区| 亚洲自拍偷拍色片视频| 国产精品久久久久久久午夜片 | 欧美高清一区二区| 亚洲欧洲三级电影| 欧美激情国产高清| 亚洲精品一区在线| 欧美日韩国产一区精品一区| 亚洲美女诱惑| 欧美视频日韩视频| 亚洲一区二区三区国产| 国产精品视频免费观看| 性色av一区二区三区红粉影视| 国产精品亚洲综合久久| 欧美一区二区三区免费视| 国产日韩欧美麻豆| 久久精品一区二区国产| 悠悠资源网亚洲青| 欧美国产精品v| 一级日韩一区在线观看| 国产精品高清网站| 欧美一区二区三区四区高清| 国产亚洲精品美女| 久久亚洲欧洲| 亚洲欧洲在线播放| 欧美日韩在线视频首页| 亚洲五月六月| 国产欧美一区二区色老头| 久久久久久久一区二区三区| 亚洲国产精品999| 欧美日韩美女在线观看| 亚洲欧美日韩在线综合| 一区在线视频| 欧美日韩成人在线| 亚洲欧美日韩中文播放| 韩日成人在线| 欧美连裤袜在线视频| 亚洲欧美精品| 韩国三级电影久久久久久| 欧美成人午夜影院| 亚洲一区二区三区中文字幕| 国产一区二区成人| 欧美xart系列在线观看| 亚洲一区bb| 狠狠狠色丁香婷婷综合激情| 欧美激情综合在线| 欧美一级精品大片| 亚洲高清二区| 国产精品剧情在线亚洲| 久久亚洲二区| 亚洲性图久久| 在线看片第一页欧美| 欧美网站在线| 久久亚洲精品一区二区| 一区二区三区视频在线观看| 国产一区高清视频| 欧美另类亚洲| 欧美一区二区免费观在线| 亚洲日本激情| 国产揄拍国内精品对白| 欧美日韩成人综合| 久久精品综合网| 亚洲色无码播放| 在线高清一区| 国产精品拍天天在线| 欧美99在线视频观看| 香蕉久久夜色精品| 亚洲看片网站| 国产亚洲一区精品| 欧美日韩在线大尺度| 久久午夜影视| 亚洲欧美日本国产有色| 亚洲国产专区校园欧美| 国产日韩欧美一区| 欧美日韩视频在线第一区| 久久偷窥视频| 亚洲欧美国产一区二区三区| 91久久极品少妇xxxxⅹ软件| 国产视频自拍一区| 欧美偷拍另类| 欧美精品在线视频| 久久字幕精品一区| 先锋影音网一区二区| 99re热精品| 亚洲国产激情| 国内外成人免费激情在线视频| 欧美色播在线播放| 欧美高清视频一区| 久久五月天婷婷| 欧美呦呦网站| 亚洲影院色无极综合| 亚洲乱码精品一二三四区日韩在线 | 亚洲毛片一区| 亚洲第一色中文字幕| 国产亚洲成av人在线观看导航| 欧美午夜一区二区三区免费大片| 欧美成年人视频网站| 久久久久成人精品| 欧美伊人久久久久久久久影院| 中日韩高清电影网| 日韩一二三区视频| 亚洲日本成人| 亚洲第一天堂av| 国产一区美女| 国产欧美日韩综合一区在线观看 | 在线观看视频免费一区二区三区 | 午夜精品一区二区三区在线播放| 中国日韩欧美久久久久久久久| 亚洲国产精品一区在线观看不卡| 一区二区视频免费完整版观看| 国产日韩欧美在线播放| 国产精品入口福利| 国产精品久久久久久久久免费桃花| 欧美日韩99| 欧美精品久久久久久| 欧美激情一区二区| 欧美精品福利| 欧美久久影院| 欧美日韩国产美| 欧美日韩精品高清| 欧美日韩国产va另类| 欧美日韩国产在线播放网站| 欧美另类高清视频在线| 欧美精品久久一区| 欧美日本一区|