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

ReentrantLock可重入鎖原理解析

 更新時間:2023年10月27日 09:24:25   作者:lane  
這篇文章主要為大家介紹了ReentrantLock可重入鎖原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

ReentrantLock 可重入鎖

字面意思理解為同一線程可以重入加鎖

內(nèi)部主要邏輯繼承AQS來實現(xiàn)的,有兩種實現(xiàn)FairSycn、NonfairSync,公平鎖和非公平鎖,默認為非公平鎖。

  • 公平鎖:保證先入隊的先獲得鎖。
  • 非公平鎖:不保證先入隊的先獲得鎖,可能后面的線程先搶到鎖。

主要實現(xiàn)流程

CAS全名compare and swap比較交換,由native方法提供的系統(tǒng)原子性操作,以保證并發(fā)發(fā)安全性。

公平鎖的實現(xiàn)

加鎖

//加鎖
final void lock() {
  acquire(1);//調(diào)用AQS方法
}
//AQS方法
public final void acquire(int arg) {
  if (!tryAcquire(arg) &&//嘗試獲取鎖,抽象方法由子類實現(xiàn)
      acquireQueued(addWaiter(Node.EXCLUSIVE), arg))    
      /* addWaiter 將線程加入等待隊列
       * acquireQueued 嘗試獲取鎖、阻塞
       */
  {
      //中斷
      selfInterrupt();
  }
}
//嘗試獲取鎖
protected final boolean tryAcquire(int acquires) {
  //獲取當前線程
  final Thread current = Thread.currentThread();
  int c = getState();//獲取state值,AQS屬性volatile標記
  if (c == 0) {//鎖空閑狀態(tài)
      if (!hasQueuedPredecessors() &&//是否需要排隊
          compareAndSetState(0, acquires)) {//獲取鎖
          setExclusiveOwnerThread(current);//成功獲取,設(shè)置鎖owner為當前線程
          return true;//后續(xù)不在處理
      }
  }
  else if (current == getExclusiveOwnerThread()) {//當前線程已持有鎖,重入
      int nextc = c + acquires;//state+1
      if (nextc < 0)
          throw new Error("Maximum lock count exceeded");
      setState(nextc);//已持有鎖,直接設(shè)置state值
      return true;
  }
  return false;
}

解鎖

//解鎖,ReentrantLock方法
public void unlock() {
  sync.release(1);//AQS方法
}
//AQS解鎖
public final boolean release(int arg) {
  if (tryRelease(arg)) {//嘗試解鎖
      Node h = head;
      if (h != null && h.waitStatus != 0)//waitStatus=0時不進行unpark(喚醒),next線程可能中斷
          unparkSuccessor(h);//喚醒隊列中的線程去獲取鎖
      return true;
  }
  return false;
}
//嘗試解鎖ReentrantLock內(nèi)部靜態(tài)類Sync實現(xiàn)
protected final boolean tryRelease(int releases) {
  int c = getState() - releases;//state-1
  if (Thread.currentThread() != getExclusiveOwnerThread())
      throw new IllegalMonitorStateException();//非持有鎖的線程進行釋放,非法操作
  boolean free = false;
  if (c == 0) {//持有鎖線程全部釋放
      free = true;
      setExclusiveOwnerThread(null);//持有鎖線程置空
  }
  setState(c);//持有鎖線程直接設(shè)置state
  return free;
}

非公平鎖的實現(xiàn)

非公平鎖和公平鎖的核心區(qū)別是在嘗試獲取鎖方法tryAcquire實現(xiàn)中沒有判斷hasQueuedPredecessors()是否需要排隊,其他邏輯和公平鎖是一致的。

以上就是ReentrantLock可重入鎖原理解析的詳細內(nèi)容,更多關(guān)于ReentrantLock可重入鎖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java replaceAll()方法報錯Illegal group reference的解決辦法

    Java replaceAll()方法報錯Illegal group reference的解決辦法

    這篇文章主要給大家介紹了關(guān)于Java replaceAll()方法報錯Illegal group reference的解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • java開發(fā)Dubbo負載均衡與集群容錯示例詳解

    java開發(fā)Dubbo負載均衡與集群容錯示例詳解

    這篇文章主要為大家介紹了java開發(fā)Dubbo負載均衡與集群容錯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • javaSE基礎(chǔ)如何通俗的理解javaBean是什么

    javaSE基礎(chǔ)如何通俗的理解javaBean是什么

    所謂的Java Bean,就是一個java類,編譯后成為了一個后綴名是 .class的文件。這就是Java Bean,很多初學者,包括當年的我自己,總是被這些專有名詞搞的暈頭轉(zhuǎn)向
    2021-10-10
  • 使用Java進行FreeMarker的web模板開發(fā)的基礎(chǔ)教程

    使用Java進行FreeMarker的web模板開發(fā)的基礎(chǔ)教程

    這篇文章主要介紹了使用Java進行FreeMarker模板引擎開發(fā)的基礎(chǔ)教程,文中針對FreeMarker的網(wǎng)頁標簽用法給出了一些例子,需要的朋友可以參考下
    2016-03-03
  • Java日常練習題,每天進步一點點(34)

    Java日常練習題,每天進步一點點(34)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java MapStruct使用配置實戰(zhàn)指南

    Java MapStruct使用配置實戰(zhàn)指南

    MapStruct是一個高效、類型安全的JavaBean映射工具,通過編譯時注解處理器生成映射代碼,它支持自動映射、自定義轉(zhuǎn)換、嵌套對象和集合的映射,并且可以與Spring集成,文章介紹了MapStruct的使用方法,以及與BeanUtils、Dozer、ModelMapper等框架的比較,感興趣的朋友一起看看吧
    2025-11-11
  • 一文帶你搞懂Spring?AI核心接口,輕松對接所有大模型

    一文帶你搞懂Spring?AI核心接口,輕松對接所有大模型

    Spring?AI簡單說就是?Spring?官方為?Java?開發(fā)者打造的?AI?應用開發(fā)框架,本文將從頂層?ChatClient?到底層?Model,逐層拆解?Spring?AI?的核心接口設(shè)計,幫你徹底理清這套萬能轉(zhuǎn)接頭的工作原理
    2026-05-05
  • idea的easyCode的 MybatisPlus模板的配置詳解

    idea的easyCode的 MybatisPlus模板的配置詳解

    這篇文章主要介紹了idea的easyCode的 MybatisPlus模板的配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 關(guān)于IDEA MybatisX插件的使用小技巧

    關(guān)于IDEA MybatisX插件的使用小技巧

    這篇文章主要介紹了關(guān)于MybatisX插件的使用小技巧,MybatisX是IDEA的一款第三方插件,可以極大地提升我們的開發(fā)效率,一起來看看吧
    2023-03-03
  • 實例詳解Spring Boot實戰(zhàn)之Redis緩存登錄驗證碼

    實例詳解Spring Boot實戰(zhàn)之Redis緩存登錄驗證碼

    本章簡單介紹redis的配置及使用方法,本文示例代碼在前面代碼的基礎(chǔ)上進行修改添加,實現(xiàn)了使用redis進行緩存驗證碼,以及校驗驗證碼的過程。感興趣的的朋友一起看看吧
    2017-08-08

最新評論

天镇县| 黄山市| 定日县| 垣曲县| 清丰县| 黄陵县| 壶关县| 福建省| 遵化市| 宣武区| 潞城市| 尼勒克县| 平果县| 镇安县| 丰都县| 孝感市| 灵台县| 义马市| 康平县| 临潭县| 汨罗市| 雷山县| 凤台县| 湟源县| 图们市| 太保市| 瑞金市| 连江县| 阳信县| 色达县| 赤城县| 封丘县| 乐都县| 永年县| 舒城县| 谢通门县| 米林县| 盐城市| 烟台市| 鹤山市| 化隆|