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

Java中的ReentrantLock實(shí)現(xiàn)原理及代碼演示

 更新時(shí)間:2024年01月13日 09:39:17   作者:java架構(gòu)師-太陽(yáng)  
這篇文章主要介紹了Java中的ReentrantLock實(shí)現(xiàn)原理及代碼演示,非公平鎖 如果已經(jīng)進(jìn)入隊(duì)列,鏈表里面的線程是先進(jìn)先出,如果已經(jīng)釋放了鎖,在搶占鎖時(shí),鏈表里面的頭結(jié)點(diǎn)和還沒(méi)有入隊(duì)列的線程搶鎖,需要的朋友可以參考下

介紹

互斥鎖 實(shí)現(xiàn)Lock接口 并且最好在 finally 塊中釋放

公平鎖 非公平鎖 如果已經(jīng)進(jìn)入隊(duì)列,鏈表里面的線程是先進(jìn)先出,如果已經(jīng)釋放了鎖,在搶占鎖時(shí),鏈表里面的頭結(jié)點(diǎn)和還沒(méi)有入隊(duì)列的線程搶鎖

使用代碼

public class Test {
    public static void main(String[] args) {
       Task task = new Task();
       for(int i = 0; i < 10; i++) {
          new Thread(task).start();
       }
    }
}
class Task implements Runnable {
    Lock lock = new ReentrantLock();
    @Override
    public void run() {
        lock.lock();
        try {
            Thread.sleep(1000);
            System.out.println("業(yè)務(wù)代碼");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

實(shí)現(xiàn)原理

采用AQS+CAS+LockSupport用來(lái)阻塞和喚醒線程)

ReentrantLock有三類內(nèi)部類,實(shí)現(xiàn)都在其內(nèi)部類Sync中,默認(rèn)是使用非公平鎖NonFairSync。

非公平鎖可提高效率,在可重入鎖時(shí)可以減少線程切換開(kāi)銷??梢酝ㄟ^(guò)構(gòu)造方法切換公平和非公平

Sync父類AbstractQueuedSynchronize(AQS) 此處的鎖具備synchronized功能,即可以阻塞一個(gè)線程。

為了實(shí)現(xiàn)一把具有阻塞或喚醒功能的鎖,需要幾個(gè)核心要素

(1) state變量,標(biāo)記鎖狀態(tài)。至少有兩個(gè)值0/1。對(duì)state的操作,使用CAS保證線程安全

  • AbstractQueuedSynchronizer類里有變量private volatile int state 記錄鎖狀態(tài)
  • state=0,沒(méi)有線程持有鎖,exclusiveOwnerThread=null
  • state=1,有一個(gè)線程持有鎖,exclusiveOwnerThread=該線程
  • state > 1,說(shuō)明該線程重入了該鎖,等于幾就重入了幾次

(2) 需要記錄當(dāng)前是哪個(gè)線程持有鎖

  • AbstractOwnableSynchronizer里面有變量private transient Thread exclusiveOwnerThread;記錄鎖持有的線程

(3) 需要底層支持對(duì)一個(gè)線程進(jìn)行阻塞或喚醒操作

  • public native void unpark(Object thread); // 喚醒某一個(gè)線程
  • public native void park(boolean isAbsolute, long time); // 阻塞某一個(gè)線程 實(shí)現(xiàn)一個(gè)線程對(duì)另外一個(gè)線程的精準(zhǔn)喚醒
  • 一般使用LockSupport的工具類,對(duì)上面兩個(gè)方法進(jìn)行了封裝
  • 當(dāng)前線程中調(diào)用park()就會(huì)被阻塞 另一個(gè)線程調(diào)用unpark(Thread t)傳入被阻塞線程就可喚醒阻塞在park()地方的線程

(4) 需要有一個(gè)隊(duì)列維護(hù)所有阻塞的線程。這個(gè)隊(duì)列也必須是線程安全的無(wú)鎖隊(duì)列,也需要使用CAS對(duì)隊(duì)列進(jìn)行增加或刪除

public abstract class AbstractQueuedSynchronizer {
  // 雙向鏈表
  static final class Node {
  volatile Thread thread;  // 每個(gè)Node對(duì)應(yīng)一個(gè)被阻塞的線程
  volatile Node prev;      // 前一個(gè)
  volatile Node next;      // 后一個(gè)
 }
private transient volatile Node head;   // 頭
private transient volatile Node tail;   // 尾
}

阻塞隊(duì)列是整個(gè)AQS核心中的核心。如下圖所示,head指向雙向鏈表頭部,tail指向雙向鏈表尾部。入隊(duì)就是把新的Node加到tail后面,然后對(duì)tail進(jìn)行CAS操作;

出隊(duì)就是對(duì)head進(jìn)行CAS操作,把head向后移一個(gè)位置

在這里插入圖片描述

初始的時(shí)候,head=tail=NULL;然后,在往隊(duì)列中加入阻塞的線程時(shí),會(huì)新建一個(gè)空的Node,讓head和tail都指向這個(gè)空Node;之后,在后面加入被阻塞的線程對(duì)象。

所以,當(dāng)head=tail的時(shí)候,說(shuō)明隊(duì)列為空。

到此這篇關(guān)于Java中的ReentrantLock實(shí)現(xiàn)原理及代碼演示的文章就介紹到這了,更多相關(guān)ReentrantLock實(shí)現(xiàn)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 圖片疊加效果Java代碼實(shí)現(xiàn)

    圖片疊加效果Java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了圖片疊加效果Java代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java Map集合詳解與演示

    Java Map集合詳解與演示

    Map用于保存具有映射關(guān)系的數(shù)據(jù),Map集合里保存著兩組值,一組用于保存Map的ley,另一組保存著Map的value,可以理解為Map中的元素是兩個(gè)對(duì)象,一個(gè)對(duì)象作為鍵,一個(gè)對(duì)象作為值。鍵不可以重復(fù),但是值可以重復(fù)
    2021-11-11
  • 從內(nèi)存模型中了解Java final的全部細(xì)節(jié)

    從內(nèi)存模型中了解Java final的全部細(xì)節(jié)

    關(guān)于final關(guān)鍵字,它也是我們一個(gè)經(jīng)常用的關(guān)鍵字,可以修飾在類上、或者修飾在變量、方法上,以此看來(lái)定義它的一些不可變性!像我們經(jīng)常使用的String類中,它便是final來(lái)修飾的類,并且它的字符數(shù)組也是被final所修飾的。但是一些final的一些細(xì)節(jié)你真的了解過(guò)嗎
    2022-03-03
  • hadoop?切片機(jī)制分析與應(yīng)用

    hadoop?切片機(jī)制分析與應(yīng)用

    切片這個(gè)詞對(duì)于做過(guò)python開(kāi)發(fā)的同學(xué)一定不陌生,但是與hadoop中的切片有所區(qū)別,hadoop中的切片是為了優(yōu)化hadoop的job在處理過(guò)程中MapTask階段的性能達(dá)到最優(yōu)而言
    2022-02-02
  • SpringBoot在線代碼修改器的問(wèn)題及解決方法

    SpringBoot在線代碼修改器的問(wèn)題及解決方法

    這篇文章主要介紹了SpringBoot在線代碼修改器的問(wèn)題及解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Kotlin 基礎(chǔ)教程之泛型

    Kotlin 基礎(chǔ)教程之泛型

    這篇文章主要介紹了Kotlin 基礎(chǔ)教程之泛型的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • java中JsonObject與JsonArray轉(zhuǎn)換方法實(shí)例

    java中JsonObject與JsonArray轉(zhuǎn)換方法實(shí)例

    在項(xiàng)目日常開(kāi)發(fā)中常常會(huì)遇到JSONArray和JSONObject的轉(zhuǎn)換,很多公司剛?cè)肼毜男∶刃聲?huì)卡在這里,下面這篇文章主要給大家介紹了關(guān)于java中JsonObject與JsonArray轉(zhuǎn)換方法的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot整合SpringDataRedis的示例代碼

    SpringBoot整合SpringDataRedis的示例代碼

    這篇文章主要介紹了SpringBoot整合SpringDataRedis的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • MyBatis ResultMap 的基本用法示例詳解

    MyBatis ResultMap 的基本用法示例詳解

    在MyBatis 中,resultMap 用于定義數(shù)據(jù)庫(kù)查詢結(jié)果到Java對(duì)象屬性的映射關(guān)系,本文給大家介紹MyBatis ResultMap的基本用法,感興趣的朋友一起看看吧
    2025-06-06
  • 詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架

    詳解SpringBoot中使用JPA作為數(shù)據(jù)持久化框架

    這篇文章主要介紹了SpringBoot中使用JPA作為數(shù)據(jù)持久化框架的相關(guān)知識(shí),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03

最新評(píng)論