亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java并發(fā)編程中的ReentrantLock類詳解

 更新時間:2023年12月12日 10:16:22   作者:程光CS  
這篇文章主要介紹了Java并發(fā)編程中的ReentrantLock類詳解,ReentrantLock是juc.locks包中的一個獨占式可重入鎖,相比synchronized,它可以創(chuàng)建多個條件等待隊列,還支持公平/非公平鎖、可中斷、超時、輪詢等特性,需要的朋友可以參考下

一、ReentrantLock介紹

ReentrantLock是juc.locks包中的一個獨占式可重入鎖,相比synchronized,它可以創(chuàng)建多個條件等待隊列,還支持公平/非公平鎖、可中斷、超時、輪詢等特性。

ReentrantLock實現(xiàn)Lock接口實現(xiàn)了一個鎖所需的方法,如lock()、unLock()等,在這些方法中實際上是調(diào)用繼承了AQS的同步器Sync對象中的方法來實現(xiàn)對鎖資源的獲取與釋放,而內(nèi)部類Sync有兩個子類FairSync和NonfairSync,分別對應(yīng)公平鎖和非公平鎖。ReentrantLock默認構(gòu)造器是構(gòu)造非公平鎖

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

二、ReentrantLock特性詳解

1. 多條件隊列

Sync對象中開放了創(chuàng)建AQS中條件隊列ConditionObject對象的方法,并重寫了isHeldExclusively()方法(通知方法signal()要用到),因此可創(chuàng)建條件隊列實現(xiàn)通知等待機制。

在這里插入圖片描述

2. 非公平 & 公平鎖

非公平鎖NonfairSync 新進來的線程會先直接與同步隊列中的線程競爭CAS競爭失敗則調(diào)用acquire -> tryAcquire -> nonfairTryAcquire繼續(xù)競爭,再失敗才會在acquire方法中后續(xù)執(zhí)行加入同步隊列若線程是重入這個鎖,會記錄重入次數(shù),若超過int范圍溢出則拋出錯誤

在這里插入圖片描述

在這里插入圖片描述

公平鎖FairSync 新來的線程若同步隊列為空才競爭鎖,否則tryAcquire直接返回false然后進入隊列排隊,實現(xiàn)先來后到公平鎖同樣也會記錄重入次數(shù)

在這里插入圖片描述

3. 可中斷

我們知道synchronized在鎖競爭時是不可中斷的,獲取不到鎖的線程會一直處于阻塞狀態(tài)。

ReentrantLock調(diào)用lockInterruptibly()獲取鎖的過程是可以響應(yīng)中斷的,其內(nèi)部調(diào)用的是AQS的acquireInterruptibly()方法

當(dāng)收到中斷信號時會退出阻塞然后拋出InterruptedException異常從而退出鎖競爭。

4. 超時

調(diào)用tryLock(long timeout, TimeUnit unit)獲取鎖可實現(xiàn)超時功能,當(dāng)超過時間還未獲取到鎖則直接拋出異常退出鎖競爭

在這里插入圖片描述

內(nèi)部是AQS中調(diào)用LockSupport.parkNanos()超時阻塞實現(xiàn)的

5. 輪詢

ReentrantLock的輪詢特性是指可通過tryLock()方法嘗試獲取鎖,沒獲取到則不阻塞直接退出,可以過會再來嘗試。tryLock()調(diào)用Sync中定義的nonfairTryAcquire方法,從前面列出的源碼可知沒獲取到則直接返回false

在這里插入圖片描述

三、ReentrantLock類和synchronized關(guān)鍵字的區(qū)別

ReentrantLock和synchronized都是獨占式可重入鎖,但是它們有如下區(qū)別:

  • 鎖實現(xiàn)機制:ReentrantLock是一個類,是基于AQS實現(xiàn)的,依賴于JDK的API;synchronized是一個關(guān)鍵字,是直接在JVM層面通過監(jiān)視器實現(xiàn)的鎖機制。
  • 條件等待隊列:ReentrantLock通過Condition可創(chuàng)建多個條件等待隊列;而synchronized依賴的監(jiān)視器模型中只有一個等待隊列。
  • 非公平 & 公平鎖:ReentrantLock支持公平和非公平鎖;synchronized為非公平鎖
  • 其他特性:ReentrantLock還支持可中斷、超時、輪詢等特性;synchronized不支持這些
  • 底層原理:ReentrantLock是基于CAS實現(xiàn)共享資源同步,synchronized底層是基于互斥量實現(xiàn)的

一般來說在不需要用到ReentrantLock特殊特性的時候就用synchronized,因為synchronized顯然相對來說使用起來更加簡潔高效

到此這篇關(guān)于Java并發(fā)編程中的ReentrantLock類詳解的文章就介紹到這了,更多相關(guān)Java的ReentrantLock類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程的控制詳解

    Java線程的控制詳解

    這篇文章主要介紹了Java中的join線程、后臺線程、線程睡眠、線程讓步以及線程的優(yōu)先級,非常的詳細,希望能對大家有所幫助
    2014-10-10
  • SpringSecurity請求授權(quán)規(guī)則配置與注解詳解

    SpringSecurity請求授權(quán)規(guī)則配置與注解詳解

    這篇文章主要介紹了SpringSecurity請求授權(quán)規(guī)則配置與注解詳解,我們常使用@Secured與@PreAuthorize兩個注解在進入方法前進行角色、權(quán)限的控制,進入方法前數(shù)據(jù)的過濾@PreFilter注解偶爾會看到,需要的朋友可以參考下
    2023-12-12
  • Java中的15種鎖

    Java中的15種鎖

    在讀很多并發(fā)文章中,會提及各種各樣鎖如公平鎖,樂觀鎖等等,這篇文章小編將向大家介紹是各種鎖的分類,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • MyBatis學(xué)習(xí)教程(八)-Mybatis3.x與Spring4.x整合圖文詳解

    MyBatis學(xué)習(xí)教程(八)-Mybatis3.x與Spring4.x整合圖文詳解

    這篇文章主要介紹了MyBatis學(xué)習(xí)教程(八)-Mybatis3.x與Spring4.x整合圖文詳解的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • RabbitMQ開啟SSL與SpringBoot連接測試的配置方法

    RabbitMQ開啟SSL與SpringBoot連接測試的配置方法

    本文基于 CentOS 7 + Git + OpenSSL + yum 安裝的 RabbitMQ,需要讀者提交安裝好。其他方式也可變通參考本文。對RabbitMQ開啟SSL與SpringBoot連接測試相關(guān)知識感興趣的朋友一起看看吧
    2022-01-01
  • spring boot整合log4j2及MQ消費處理系統(tǒng)日志示例

    spring boot整合log4j2及MQ消費處理系統(tǒng)日志示例

    這篇文章主要為大家介紹了spring boot整合log4j2及MQ消費處理系統(tǒng)日志的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Springboot項目快速實現(xiàn)過濾器功能

    Springboot項目快速實現(xiàn)過濾器功能

    上篇文章已經(jīng)給大家介紹了Springboot項目如何快速實現(xiàn)Aop功能,這篇文章給大家介紹Springboot項目如何快速實現(xiàn)過濾器功能,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • Java實現(xiàn)快速并查集

    Java實現(xiàn)快速并查集

    這篇文章主要為大家詳細介紹了Java實現(xiàn)快速并查集,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Java將文件上傳到ftp服務(wù)器

    Java將文件上傳到ftp服務(wù)器

    這篇文章主要為大家詳細介紹了Java將文件上傳到ftp服務(wù)器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 小項目改造快速引入 mybatis的流程分析

    小項目改造快速引入 mybatis的流程分析

    這篇文章主要介紹了小項目改造快速引入 mybatis,功能方面非常簡單,考慮到開發(fā)速度,直接按 springboot 項目進行開發(fā),依賴方面僅僅使用 spring-boot-starter-web, spring-boot-starter-jdbc, sqljdbc4, lombook,需要的朋友可以參考下
    2022-05-05

最新評論