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

Java中synchronized鎖的深入理解

 更新時間:2023年05月29日 08:35:02   作者:舒一笑  
這篇本文主要對Java中synchronized鎖進行深入理解,文中通過synchronized的優(yōu)化,synchronized的實現(xiàn)原理及synchronized的升級過程來介紹Java中synchronized鎖,感興趣的同學可以跟著小編一起來學習

使用范圍

  • synchronized使用上用于同步方法或者同步代碼塊
  • 在鎖實現(xiàn)上是基于對象去實現(xiàn)
  • 使用中用于對static修飾的便是class類鎖
  • 使用中用于對非static修飾的便是當前對象鎖

synchronized的優(yōu)化

  • 在jdk1.6中對synchronized做了相關的優(yōu)化

鎖消除

  • 在synchronized修飾的代碼塊中,要是不涉及操作臨界資源的情況,即便你寫了synchronized修飾,也不會出發(fā)鎖機制

鎖膨脹

  • 在一個循環(huán)中頻繁的出現(xiàn)鎖資源的獲取與釋放操作,會帶來資源的消耗,于是便會將鎖的范圍擴大到循環(huán)的外邊,避免頻繁的競爭和獲取鎖資源而導致的資源消耗
  public void method(){
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            synchronized ("") {
                // 業(yè)務代碼
            }
        }
    }

鎖升級

  • ReentrantLock中是基于樂觀鎖的CAS獲取線程資源。資源拿不到的情況下才會掛起線程。synchronized在jdk1.6之間完全獲取不到鎖的情況下立即掛起線程,但是在1.6之后進行了鎖的升級與優(yōu)化。
  • 無鎖、匿名偏向:當前對象沒有作為鎖的存在
  • 偏向鎖:當前鎖資源,只有一個線程頻繁的獲取和釋放鎖,那么只有該線程獲取鎖是判斷是否是同一個線程,如果是線程資源拿走。如果線程不是當前自己的線程,則采用基于CAS的方式,嘗試將偏向鎖指向當前線程。如果獲取不到則觸發(fā)鎖升級為輕量級鎖,也就意味著發(fā)生了鎖競爭的情況。
  • 輕量級鎖:使用自旋鎖的方式頻繁的采用CAS的方式獲取鎖資源。這里采用的自適應自旋鎖(JVM更具上次的自旋結(jié)果來進行判斷本次的自旋時間長短)。如果成功獲取鎖資源,資源取走。如果獲取鎖資源失敗,鎖升級。
  • 重量級鎖:最為傳統(tǒng)的synchronized實現(xiàn)方式。拿不到鎖資源之間掛起線程,然后進行用戶態(tài)和內(nèi)核態(tài)的不斷切換。。。

synchronized鎖的實現(xiàn)原理

  • synchronized鎖是基于對象來進行實現(xiàn)的

  • 關于MarkWord的內(nèi)容展開示意圖

  • 從圖中可以看出通過鎖的標志位來進行區(qū)分鎖的不同狀態(tài)

synchronized鎖升級的過程演示

  • 使用之前需要導入一個依賴
<dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.9</version>
        </dependency>

  • 鎖在默認情況下,開啟了偏向鎖的延遲
  • 原因是因為在偏向鎖升級為輕量級鎖的時候會涉及到偏向鎖的撤銷,需要等到一個安全點(STW),才能完成對偏向鎖的撤銷,所以在并發(fā)的情況下就可以選擇不開啟偏向鎖,或者設置偏向鎖延遲開啟
  • 在JVM啟動時會大量加載.class文件到內(nèi)存,該操作會涉及synchronized使用,為了避免出現(xiàn)偏向鎖撤銷的操作。在啟動初期,有一個延遲5s開啟偏向鎖的操作。
  • 要是正常開啟偏向鎖,那么就不會出現(xiàn)無鎖的狀態(tài),而是直接進入匿名偏向鎖

  • 變成了偏向鎖

/**
 * @author
 * @date 2023/5/28
 */
public class Test15 {
    public static void main(String[] args) throws InterruptedException {
        Thread.sleep(5000);
        Object o = new Object();
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
		//thread 線程偏向鎖
        Thread thread = new Thread(()->{
            synchronized (o){
                System.out.println("thread線程 :"+ClassLayout.parseInstance(o).toPrintable());
            }
        });
        thread.start();
        // 輕量級鎖 -> 重量級鎖
        synchronized (o){
            System.out.println("main線程 :"+ClassLayout.parseInstance(o).toPrintable());
        }
    }
}

鎖轉(zhuǎn)換狀態(tài)示意圖

LockRecord和ObjectMonitor存儲的內(nèi)容示意圖

以上就是Java中synchronized鎖的深入理解的詳細內(nèi)容,更多關于Java synchronized鎖的資料請關注腳本之家其它相關文章!

相關文章

  • JavaWeb響應下載功能實例代碼(包含工具類)

    JavaWeb響應下載功能實例代碼(包含工具類)

    今天通過本文給大家分享的是關于javaweb的響應(response)下載功能,需要的朋友參考下吧
    2017-07-07
  • MyBatis的@SelectProvider注解構(gòu)建動態(tài)SQL方式

    MyBatis的@SelectProvider注解構(gòu)建動態(tài)SQL方式

    這篇文章主要介紹了MyBatis的@SelectProvider注解構(gòu)建動態(tài)SQL方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java線程間共享實現(xiàn)方法詳解

    Java線程間共享實現(xiàn)方法詳解

    這篇文章主要介紹了Java線程間共享實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java多線程通信問題深入了解

    Java多線程通信問題深入了解

    下面小編就為大家?guī)硪黄钊肜斫釰AVA多線程之線程間的通信方式。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • Java使用split截取字符串過程解析

    Java使用split截取字符串過程解析

    這篇文章主要介紹了Java使用split截取字符串過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • IntelliJ IDEA基于Maven構(gòu)建Java項目

    IntelliJ IDEA基于Maven構(gòu)建Java項目

    在 Java 開發(fā)中,使用 Maven 是一種廣泛采用的構(gòu)建工具,本文主要介紹了IntelliJ IDEA基于Maven構(gòu)建Java項目,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • IDEA引MAVEN項目jar包依賴導入問題解決方法

    IDEA引MAVEN項目jar包依賴導入問題解決方法

    這篇文章主要介紹了IDEA引MAVEN項目jar包依賴導入問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 關于Spring3 + Mybatis3整合時多數(shù)據(jù)源動態(tài)切換的問題

    關于Spring3 + Mybatis3整合時多數(shù)據(jù)源動態(tài)切換的問題

    這篇文章主要介紹了關于Spring3 + Mybatis3整合時多數(shù)據(jù)源動態(tài)切換的問題,需要的朋友可以參考下
    2017-04-04
  • jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面

    jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面

    這篇文章主要介紹了jsp+dao+bean+servlet(MVC模式)實現(xiàn)簡單用戶登錄和注冊頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot自動裝配原理詳細解析

    SpringBoot自動裝配原理詳細解析

    這篇文章主要介紹了SpringBoot自動裝配原理詳細解析,一個對象交給Spring來管理的三種方式 @Bean @Compoment @Import,
    @Bean主要在@Configuration中,通過方法進行注入相關的Bean,@Compoent與@Service歸為一類,在類上加注入對應的類,需要的朋友可以參考下
    2024-01-01

最新評論