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

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中的位運算符、移位運算詳細介紹

    Java中的位運算符、移位運算詳細介紹

    這篇文章主要介紹了Java中的位運算符、移位運算,有需要的朋友可以參考一下
    2013-12-12
  • Mybatis如何分割字符串

    Mybatis如何分割字符串

    這篇文章主要介紹了Mybatis如何分割字符串問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java各種鎖在工作中使用場景和細節(jié)經(jīng)驗總結(jié)

    Java各種鎖在工作中使用場景和細節(jié)經(jīng)驗總結(jié)

    本章主要說一說鎖在工作中的使用場景,主要以 synchronized 和 CountDownLatch 為例,會分別描述一下這兩種鎖的使用場景和姿勢
    2022-03-03
  • SpringCloud全面解析@FeignClient標識接口的過程

    SpringCloud全面解析@FeignClient標識接口的過程

    這篇文章主要介紹了SpringCloud全面解析@FeignClient標識接口的過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java設(shè)計模式以虹貓藍兔的故事講解橋接模式

    Java設(shè)計模式以虹貓藍兔的故事講解橋接模式

    橋接是用于把抽象化與實現(xiàn)化解耦,使二者可以獨立變化。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它通過提供抽象化和實現(xiàn)化之間的橋接結(jié)構(gòu),來實現(xiàn)二者的解耦。這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立于接口實現(xiàn)類。這兩種類型的類可被結(jié)構(gòu)化改變而互不影響
    2022-04-04
  • SpringBoot配置文件properties和yml的實現(xiàn)

    SpringBoot配置文件properties和yml的實現(xiàn)

    本文主要介紹了SpringBoot配置文件properties和yml的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • java文件操作工具類實現(xiàn)復(fù)制文件和文件合并

    java文件操作工具類實現(xiàn)復(fù)制文件和文件合并

    這篇文章主要介紹了java文件操作工具類,類實現(xiàn)了復(fù)制文件和文件合并的功能,需要的朋友可以參考下
    2014-03-03
  • Hadoop源碼分析一架構(gòu)關(guān)系簡介

    Hadoop源碼分析一架構(gòu)關(guān)系簡介

    本篇是Hadoop源碼分析系列文章第一篇,主要介紹一下Hadoop的基礎(chǔ)簡介以及框架關(guān)系,后續(xù)本系列文章會持續(xù)更新,有需要的朋友可以借鑒參考下
    2021-09-09
  • SpringCloud超詳細講解微服務(wù)網(wǎng)關(guān)Zuul

    SpringCloud超詳細講解微服務(wù)網(wǎng)關(guān)Zuul

    這篇文章主要介紹了SpringCloud Zuul微服務(wù)網(wǎng)關(guān),負載均衡,熔斷和限流,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實現(xiàn)詳解

    Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實現(xiàn)詳解

    在某些應(yīng)用場景中需要大量的二維數(shù)組來進行數(shù)據(jù)存儲,但是二維數(shù)組中卻有著大量的無用的位置占據(jù)著內(nèi)存空間,稀疏數(shù)組就是為了優(yōu)化二維數(shù)組,節(jié)省內(nèi)存空間
    2022-09-09

最新評論