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

Java鎖擦除與鎖粗化概念和使用詳解

 更新時間:2023年02月13日 08:32:28   作者:每天都要進(jìn)步一點點  
這篇文章主要介紹了Java鎖擦除與鎖粗化概念和使用,鎖擦除的主要判定依據(jù)來源于逃逸分析的數(shù)據(jù)支持,如果判斷在一段代碼中,堆上的所有數(shù)據(jù)都不會逃逸出去從而被其他線程訪問到,那就可以把它們當(dāng)做棧上數(shù)據(jù)對待,認(rèn)為它們是線程私有的,同步加鎖自然就無須進(jìn)行

一、什么是鎖擦除

鎖擦除是指虛擬機即時編譯器(JIT)在運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進(jìn)行擦除。鎖擦除的主要判定依據(jù)來源于逃逸分析的數(shù)據(jù)支持,如果判斷在一段代碼中,堆上的所有數(shù)據(jù)都不會逃逸出去從而被其他線程訪問到,那就可以把它們當(dāng)做棧上數(shù)據(jù)對待,認(rèn)為它們是線程私有的,同步加鎖自然就無須進(jìn)行。

二、鎖擦除的演示

public class LockErasureDemo {
    public static void main(String[] args) {
        new Thread(() -> {
            String contact = contact("aa", "bb", "cc");
            System.out.println(Thread.currentThread().getName() + ":" + contact);
        }, "t1").start();
        new Thread(() -> {
            String contact = contact("dd", "ee", "ff");
            System.out.println(Thread.currentThread().getName() + ":" + contact);
        }, "t2").start();
    }
    private static String contact(String s1, String s2, String s3) {
        StringBuffer stringBuffer = new StringBuffer();
        return stringBuffer.append(s1).append(s2).append(s3).toString();
    }
}

觀察上面的代碼,我們都知道StringBuffer的append方法是加了synchronized的同步方法:

public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

這里鎖住的對象其實就是stringBuffer這個局部變量,因為是局部變量,所以每個線程進(jìn)來生成的stringBuffer對象不同,相當(dāng)于每個線程自己new了一把鎖,所以這里不存在競爭同一把鎖的問題,JVM底層會將這個鎖進(jìn)行擦除。

三、什么是鎖粗化

原則上,我們在編寫代碼的時候,總是推薦將同步塊的作用范圍限制得盡量小,只在共享數(shù)據(jù)的實際作用域中才進(jìn)行同步,這樣是為了使得需要同步的操作數(shù)量盡可能變小,如果存在鎖競爭,那等待鎖的線程也能盡快拿到鎖。大部分情況下,上面的原則都是正確的,但是如果一系列的連續(xù)操作都對同一個對象反復(fù)加鎖和解鎖,甚至加鎖操作是出現(xiàn)在循環(huán)體中的,那即使沒有線程競爭,頻繁地進(jìn)行互斥同步操作也會導(dǎo)致不必要的性能損耗。

四、鎖粗化的演示

public class LockCoarseningDemo {
    static Object objLock = new Object();
    public static void main(String[] args) {
        // 反復(fù)加鎖、解鎖
        new Thread(() -> {
            synchronized (objLock) {
                System.out.println("a");
            }
            synchronized (objLock) {
                System.out.println("b");
            }
            synchronized (objLock) {
                System.out.println("c");
            }
        }, "t1").start();
    }
}

觀察上面的案例,同一個線程對同一把鎖,反復(fù)不斷地獲取鎖、釋放鎖,這樣肯定影響性能。為了避免重復(fù)的加鎖解鎖,JVM可能會將上面的代碼優(yōu)化成下面這樣:

// 鎖粗化: 如果方法中首尾相接,前后相鄰的都是同一個鎖對象,那JIT編譯器就會把這幾個synchronized塊合并成一個大塊
// 加粗加大范圍,一次申請鎖即可,避免多次的申請和釋放鎖,提升性能
new Thread(() -> {
    synchronized (objLock) {
        System.out.println("a");
        System.out.println("b");
        System.out.println("c");
    }
}, "t1").start();

到此這篇關(guān)于Java鎖擦除與鎖粗化概念和使用詳解的文章就介紹到這了,更多相關(guān)Java鎖擦除與鎖粗化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java工具類之實現(xiàn)java獲取文件行數(shù)

    java工具類之實現(xiàn)java獲取文件行數(shù)

    這篇文章主要介紹了一個java工具類,可以取得當(dāng)前項目中所有java文件總行數(shù),代碼行數(shù),注釋行數(shù),空白行數(shù),需要的朋友可以參考下
    2014-03-03
  • java去掉文本中多余的空格與空行實例代碼

    java去掉文本中多余的空格與空行實例代碼

    在最近的一個項目中發(fā)現(xiàn)用戶提交的數(shù)據(jù)中多了很多多余的空格與空行,為了不影響使用,只能想辦法去掉了,下面這篇文章主要給大家介紹了關(guān)于java去掉文本中多余的空格與空行的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 用C和JAVA分別創(chuàng)建鏈表的實例

    用C和JAVA分別創(chuàng)建鏈表的實例

    使用用C和JAVA分別創(chuàng)建鏈表的方法,創(chuàng)建鏈表、往鏈表中插入數(shù)據(jù)、刪除數(shù)據(jù)等操作。
    2013-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)及算法實例:考拉茲猜想 Collatz Conjecture

    Java數(shù)據(jù)結(jié)構(gòu)及算法實例:考拉茲猜想 Collatz Conjecture

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實例:考拉茲猜想 Collatz Conjecture,本文直接給出實現(xiàn)代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-06-06
  • Java實現(xiàn)簡易圖書借閱系統(tǒng)

    Java實現(xiàn)簡易圖書借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡易圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java線程協(xié)調(diào)運行操作實例詳解

    Java線程協(xié)調(diào)運行操作實例詳解

    這篇文章主要介紹了Java線程協(xié)調(diào)運行操作,結(jié)合具體實例形式詳細(xì)分析了Java線程協(xié)調(diào)運行原理、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-09-09
  • Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解

    Java8日期類LocalDate、LocalTime和LocalDateTime使用方法詳解

    這篇文章主要給大家介紹了關(guān)于Java8日期類LocalDate、LocalTime和LocalDateTime使用方法的相關(guān)資料,LocalDateTime是JDK1.8出現(xiàn)的新特性,解決線程不安全的問題,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java并發(fā)編程中的CompletableFuture使用詳解

    Java并發(fā)編程中的CompletableFuture使用詳解

    這篇文章主要介紹了Java并發(fā)編程中的CompletableFuture使用詳解,Future接口定義了操作異步任務(wù)執(zhí)行的一些方法,如獲取異步任務(wù)執(zhí)行的結(jié)果、取消任務(wù)的執(zhí)行、判斷任務(wù)是否被取消,判斷任務(wù)是否執(zhí)行完畢等,需要的朋友可以參考下
    2023-12-12
  • 如何用Springboot Admin監(jiān)控你的微服務(wù)應(yīng)用

    如何用Springboot Admin監(jiān)控你的微服務(wù)應(yīng)用

    這篇文章主要介紹了如何用Springboot Admin監(jiān)控你的微服務(wù)應(yīng)用,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下。
    2021-01-01
  • java圖片滑動驗證(登錄驗證)原理與實現(xiàn)方法詳解

    java圖片滑動驗證(登錄驗證)原理與實現(xiàn)方法詳解

    這篇文章主要介紹了java圖片滑動驗證(登錄驗證)原理與實現(xiàn)方法,結(jié)合實例形式詳細(xì)分析了java圖片滑動登錄驗證的相關(guān)原理、實現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2019-09-09

最新評論