最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談一下Java中的ReentrantLock

 更新時(shí)間:2023年09月27日 10:51:54   作者:緣丶沐逸塵  
這篇文章主要介紹了淺談一下Java中的ReentrantLock,這個(gè)類是JUC工具包中對(duì)線程安全問題提供的一種解決方案,它主要是用來給對(duì)象上鎖,保證同一時(shí)間這能有一個(gè)線程在訪問當(dāng)前對(duì)象,需要的朋友可以參考下

一、ReentrantLock是用來做什么的?

這個(gè)類是JUC工具包中對(duì)線程安全問題提供的一種解決方案,它主要是用來給對(duì)象上鎖,保證同一時(shí)間這能有一個(gè)線程在訪問當(dāng)前對(duì)象。這樣處理是為了防止如果一個(gè)線程對(duì)某個(gè)公共變量進(jìn)行了改變,而其它線程讀取時(shí)讀出來的是原有數(shù)據(jù)導(dǎo)致臟讀的問題。

二、ReentrantLock的實(shí)現(xiàn)原理是什么?

ReentrantLock主要是通過同步隊(duì)列和CAS機(jī)制來實(shí)現(xiàn)的,它實(shí)現(xiàn)的過程中主要包含下面幾個(gè)屬性:

  • status:鎖狀態(tài),0表示沒有線程獲取鎖,1表示已有線程獲取鎖
  • exclusiveOwnerThread:當(dāng)前持有鎖的線程
  • Node:節(jié)點(diǎn),是ReentrantLock內(nèi)部維持的一個(gè)雙向鏈表(同步阻塞隊(duì)列)的基本構(gòu)成

具體流程

1、上鎖更新鎖狀態(tài):當(dāng)A線程持有鎖時(shí),會(huì)通過CAS將status狀態(tài)置為1,并將A線程自身存入exclusiveOwnerThread屬性當(dāng)中;

2、線程入隊(duì):而后線程B通過CAS獲取鎖時(shí)發(fā)現(xiàn)無法獲取鎖,此時(shí)就會(huì)獲取node信息,但是由于node雙向鏈表是null所以會(huì)通過CAS來創(chuàng)建一個(gè)雙向鏈表的head對(duì)象,之后再把線程B封裝成的Node節(jié)點(diǎn)通過尾插法接入雙向鏈表的尾部;

3、線程阻塞:入隊(duì)完成后再調(diào)用park方法進(jìn)行阻塞;

4、釋放鎖并更新鎖狀態(tài):當(dāng)A線程釋放鎖時(shí)會(huì)將status屬性重置為0,且把exclusiveOwnerThread置為null;

5、喚醒線程:A線程釋放鎖完畢后會(huì)調(diào)用unpark方法來喚醒雙向鏈表中下一節(jié)點(diǎn)的線程B;

三、ReentrantLock對(duì)比于Synchronized有哪些優(yōu)缺點(diǎn)?

1、ReentrantLock的鎖狀態(tài)是可見的,而Synchronized的鎖狀態(tài)是不可見的;

2、ReentrantLock是JDK層面的實(shí)現(xiàn),而Synchronized是JVM層面的實(shí)現(xiàn);

3、ReentrantLock需要手動(dòng)釋放鎖,而Synchronized不需要手動(dòng)釋放鎖;

4、ReentrantLock可以是非公平鎖也可以是公平鎖,而Synchronized只能是非公平鎖;

5、ReentrantLock是可被中斷的,而Synchronized是不可悲中斷的;

6、Synchronized在特定條件下是后來的線程先獲取鎖,而ReentrantLock是先來的線程先獲取鎖;

四、ReentrantLock的簡(jiǎn)單使用

static ReentrantLock lock = new ReentrantLock();
for (int i = 0; i < 10; i++) {
    Thread thread = new Thread(() -> {
        lock.lock();
        try {
            for (int j = 0; j < 10000; j++) {
                sum++;
            }
        } finally {
            lock.unlock();
            latch.countDown();
        }
    });
    thread.start();
}

到此這篇關(guān)于淺談一下Java中的ReentrantLock的文章就介紹到這了,更多相關(guān)淺談ReentrantLock內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Java類的構(gòu)造方法詳解

    關(guān)于Java類的構(gòu)造方法詳解

    這篇文章主要介紹了關(guān)于Java類的構(gòu)造方法詳解的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于springboot打包目錄全解析

    關(guān)于springboot打包目錄全解析

    這篇文章主要介紹了springboot打包目錄解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java導(dǎo)出生成csv文件的方法

    java導(dǎo)出生成csv文件的方法

    這篇文章主要為大家詳細(xì)介紹了java導(dǎo)出生成csv文件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java獲取媒體文件時(shí)長(zhǎng)的多種實(shí)現(xiàn)方法

    Java獲取媒體文件時(shí)長(zhǎng)的多種實(shí)現(xiàn)方法

    本文主要介紹了Java獲取媒體文件時(shí)長(zhǎng)的多種實(shí)現(xiàn)方法,包括使用第三方庫如ApacheCommonsIO、JAVE或FFmpeg,通過這些方法,可以方便地獲取不同媒體格式文件的時(shí)長(zhǎng),感興趣的可以了解一下
    2025-11-11
  • Java跳出多重嵌套循環(huán)過程解析

    Java跳出多重嵌套循環(huán)過程解析

    這篇文章主要介紹了Java跳出多重嵌套循環(huán)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java中輸出pdf文件代碼分享

    java中輸出pdf文件代碼分享

    這篇文章主要介紹了java中輸出pdf文件代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題

    maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題

    本地倉庫是遠(yuǎn)程倉庫的一個(gè)緩沖和子集,當(dāng)你構(gòu)建Maven項(xiàng)目時(shí)首先會(huì)從本地倉庫查找資源,如果沒有那么Maven會(huì)從遠(yuǎn)程倉庫下載到你本地倉庫,這篇文章主要給大家介紹了關(guān)于maven安裝、使用、配置本地倉庫、idea配置maven以及解決plugins報(bào)錯(cuò)問題的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • DragChartPanel可拖拽曲線應(yīng)用詳解

    DragChartPanel可拖拽曲線應(yīng)用詳解

    這篇文章主要為大家詳細(xì)介紹了DragChartPanel可拖拽曲線的應(yīng)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Mybatis-plus中QueryWrapper的多種用法小結(jié)

    Mybatis-plus中QueryWrapper的多種用法小結(jié)

    本文主要介紹了Mybatis-plus中QueryWrapper的多種用法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java?方法的定義與調(diào)用詳解

    Java?方法的定義與調(diào)用詳解

    在java中,方法就是用來完成解決某件事情或?qū)崿F(xiàn)某個(gè)功能的辦法。方法實(shí)現(xiàn)的過程中,會(huì)包含很多條語句用于完成某些有意義的功能——通常是處理文本,控制輸入或計(jì)算數(shù)值,這篇文章我們來探究一下方法的定義與調(diào)用
    2022-04-04

最新評(píng)論

靖江市| 泸西县| 方城县| 伊宁县| 云和县| 潼关县| 临沧市| 甘谷县| 关岭| 策勒县| 白银市| 望都县| 库尔勒市| 鄂托克前旗| 河津市| 安泽县| 台江县| 枝江市| 商都县| 昆明市| 长岭县| 临沂市| 涞源县| 临澧县| 军事| 延吉市| 威远县| 射阳县| 安福县| 邯郸市| 郓城县| 比如县| 霍林郭勒市| 盐池县| 枣强县| 吴桥县| 沐川县| 宜宾县| 洛浦县| 乃东县| 民丰县|