欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java鎖的升級策略 偏向鎖 輕量級鎖 重量級鎖

 更新時間:2019年06月03日 08:30:37   投稿:laozhang  
在本文中小編給的大家整理了關于Java鎖的升級策略 偏向鎖 輕量級鎖 重量級鎖的相關知識點內(nèi)容,需要的朋友們參考下。

這三種鎖是指鎖的狀態(tài),并且是專門針對Synchronized關鍵字。JDK 1.6 為了減少"重量級鎖"的性能消耗,引入了“偏向鎖”和“輕量級鎖”,鎖一共擁有4種狀態(tài):無鎖狀態(tài)、偏向鎖、輕量級鎖、重量級鎖。鎖狀態(tài)是通過對象頭的Mark Word來進行標記的:

鎖可以升級但不能降級,意味著偏向鎖升級成輕量級鎖后不能降級成偏向鎖,這種鎖升級卻不能降級的策略,是為了提高獲得鎖和釋放鎖的效率

重量級鎖:依賴于底層操作系統(tǒng)的Mutex Lock,線程會被阻塞住

缺點:加鎖和解鎖需要從用戶態(tài)切換到內(nèi)核態(tài),性能消耗較大

輕量級鎖:基于重量級鎖進行了優(yōu)化(避免上下文切換,提高了性能),它假設多線程競爭是互相錯開的,不會發(fā)生線程阻塞,呢么上下文切換就是多余的

第一個特點:采用了CAS操作加鎖和解鎖,由于輕量級鎖的鎖記錄(Lock Record)是存放在對象頭和線程空間里的,因此加鎖和解鎖不需要上下文切換,性能消耗較小

第二個特點:一旦發(fā)生多線程競爭,首先基于“自旋鎖”思想,自旋CPU循環(huán)等待一段時間,不會發(fā)生上下文切換,如果還是無法獲得鎖,就將鎖升級為重量級鎖

偏向鎖:基于輕量級鎖進行了優(yōu)化(減少多次的加鎖和解鎖,提高了性能),它假設整個過程只有一個線程獲得鎖,呢么多次的加鎖和解鎖就是多余的

特點:在第一次獲得鎖之后不會釋放鎖,它會一直持有鎖,后續(xù)進入鎖時只需檢查一下鎖狀態(tài)和偏向線程ID是否為自己,從而省去了多次的加鎖和解鎖

1.偏向鎖

獲取鎖:

檢測對象頭的Mark Word是否為可偏向狀態(tài)(即是否為偏向鎖1,鎖標志位是否為01),如果不是,嘗試競爭鎖:嘗試CAS操作將Mark Word的線程ID設置為當前線程ID,以表示線程獲得鎖,如果失敗說明鎖已被占用

若為可偏向狀態(tài),則檢查線程ID是否為當前線程ID,如果是則表示當前線程已經(jīng)持有鎖(鎖的可重入),否則說明鎖已被占用

如果鎖已被占用,只能撤銷偏向鎖為無鎖狀態(tài)或輕量級鎖

釋放鎖:(偏向鎖使用了一種等到競爭出現(xiàn)才釋放鎖的機制,線程是不會主動釋放偏向鎖的,只有當其他線程競爭偏向鎖時,持有偏向鎖的線程才會釋放鎖)

偏向鎖的撤銷需要等待全局安全點(在這個時間點沒有正在執(zhí)行的字節(jié)碼),暫停擁有偏向鎖的線程,檢查持有偏向鎖的線程是否還活著

如果線程掛了,則將對象頭設置成無鎖狀態(tài);如果線程仍然活著,則將對象頭設置為輕量級鎖(鎖的升級),最終輕量級鎖一定會被釋放

2.輕量級鎖

獲取鎖:

檢測對象頭的Mark Word是否為輕量級鎖(鎖標志位為00),如果不是,嘗試競爭鎖:JVM首先在當前線程的棧幀中建立一個鎖記錄(Lock Record),用于備份存儲對象頭的Mark Word(官方把這份拷貝加了一個Displaced前綴,稱為Displaced Mark Word),然后JVM嘗試CAS操作將Mark Word更新為指向Lock Record的指針,以表示線程獲得鎖,如果失敗說明鎖已被占用

若為輕量級鎖,判斷對象頭的Mark Word是否指向當前線程的棧幀的Lock Record,如果是則表示當前線程已經(jīng)持有鎖(鎖的可重入),否則說明鎖已被占用

如果鎖已被占用,當前線程便嘗試自旋CPU來獲取鎖,自旋一定次數(shù)后輕量級鎖會膨脹為重量級鎖(鎖標志位變成10),線程進入阻塞

釋放鎖:

嘗試CAS操作將Displaced Mark Word中替換回對象頭,如果成功,說明輕量級鎖釋放成功

如果CAS操作失敗,說明存在鎖競爭,鎖已經(jīng)膨脹成重量級鎖,需要在釋放鎖的同時喚醒那些被掛起的線程

3.重量級鎖

重量級鎖依賴于底層操作系統(tǒng)的Mutex Lock,所有線程都會被阻塞住,線程之間的切換需要從用戶態(tài)到內(nèi)核態(tài),切換成本非常高。

總結:鎖的優(yōu)缺點對比

優(yōu)點 缺點 適用場景
偏向鎖(Biased Lock) 加鎖和解鎖不需要額外的消耗,和執(zhí)行非同步方法相比僅存在納秒級的差距 如果線程間存在鎖競爭,會帶來額外的鎖撤銷 適用于只有一個線程訪問
輕量級鎖(Lightweight Lock) 競爭的線程不會阻塞,提高了程序的響應速度 對于得不到鎖的線程,自旋會消耗CPU 追求響應時間,或者要求臨界區(qū)簡短,自旋不會占用CPU過久
重量級鎖(Heavyweight Lock) 線程競爭不使用自旋,不會消耗CPU資源 線程阻塞,響應時間緩慢 追求吞吐量

相關文章

  • spring整合shiro框架的實現(xiàn)步驟記錄

    spring整合shiro框架的實現(xiàn)步驟記錄

    Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能。下面這篇文章主要給大家介紹了關于spring整合shiro框架的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-05-05
  • SpringBoot集成swagger-ui以及swagger分組顯示操作

    SpringBoot集成swagger-ui以及swagger分組顯示操作

    這篇文章主要介紹了SpringBoot集成swagger-ui以及swagger分組顯示操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Mybatis-Plus中Mapper的接口文件與xml文件相關的坑記錄

    Mybatis-Plus中Mapper的接口文件與xml文件相關的坑記錄

    這篇文章主要介紹了Mybatis-Plus中Mapper的接口文件與xml文件相關的坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java創(chuàng)建和啟動線程的兩種方式實例分析

    Java創(chuàng)建和啟動線程的兩種方式實例分析

    這篇文章主要介紹了Java創(chuàng)建和啟動線程的兩種方式,結合實例形式分析了java多線程創(chuàng)建、使用相關操作技巧與注意事項,需要的朋友可以參考下
    2019-09-09
  • mybatis映射文件mapper.xml的具體寫法

    mybatis映射文件mapper.xml的具體寫法

    在開發(fā)過程中,需要開發(fā)人員配置mapper映射文件,本文主要介紹了mybatis映射文件mapper.xml的具體寫法,感興趣的可以了解一下
    2021-09-09
  • SpringSecurity之SecurityContextHolder使用解讀

    SpringSecurity之SecurityContextHolder使用解讀

    這篇文章主要介紹了SpringSecurity之SecurityContextHolder使用解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot深入分析講解日期時間處理

    Spring Boot深入分析講解日期時間處理

    項目中使用LocalDateTime系列作為DTO中時間的數(shù)據(jù)類型,但是SpringMVC收到參數(shù)后總報錯,為了配置全局時間類型轉換,嘗試了如下處理方式
    2022-06-06
  • SpringBoot+JWT實現(xiàn)注冊、登錄、狀態(tài)續(xù)簽流程分析

    SpringBoot+JWT實現(xiàn)注冊、登錄、狀態(tài)續(xù)簽流程分析

    這篇文章主要介紹了SpringBoot+JWT實現(xiàn)注冊、登錄、狀態(tài)續(xù)簽【登錄保持】,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • spring boot中interceptor攔截器未生效的解決

    spring boot中interceptor攔截器未生效的解決

    這篇文章主要介紹了spring boot中interceptor攔截器未生效的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 基于Spring Boot保護Web應用程序

    基于Spring Boot保護Web應用程序

    這篇文章主要介紹了基于Spring Boot保護Web應用程序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論