成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

干貨ReentrantLock非公平鎖源碼分析

開發 前端
ReentrantLock 是 Lock 的一種實現,是一種可重入的公平或非公平鎖。默認是非公平鎖。

[[339001]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。   

1.鎖

java中,加鎖的方式

  1. synchronized,這個是 java 底層實現的,也就是 C 語言實現的。
  2. . lock,這個是 java.util.concurrent 包下面的,是 java語言實現的。

2.ReentrantLock

ReentrantLock 是 Lock 的一種實現,是一種可重入的公平或非公平鎖。默認是非公平鎖。

2.1 Lock的創建

首先看下鎖的創建和使用代碼:

  1. //創建鎖 
  2. Lock lock  = new ReentrantLock(); 
  3. //加鎖 
  4. lock.lock(); 
  5. //釋放鎖 
  6. lock.unlock(); 

然后看下創建的是 ReentrantLock 的構造函數:

  1. public ReentrantLock() { 
  2.     sync = new NonfairSync(); 

NonfairSync 就是非公平鎖。所以 ReentrantLock 默認是非公平鎖的實現

2.2 lock()

加鎖的邏輯就比較復雜了,因為存在線程競爭。所以有兩種情況,一種是競爭到鎖的處理,一種是沒有競爭到鎖的處理。

首先我們還是來看下 lock() 方法,因為最終是非公平的實現,所以直接看 NonfairSync 里面的 lock 方法。

  1. final void lock() { 
  2.     if (compareAndSetState(0, 1)) 
  3.         setExclusiveOwnerThread(Thread.currentThread()); 
  4.     else 
  5.         acquire(1); 

2.3 沒有獲取到鎖的邏輯 acquire()

直接上代碼:

  1. public final void acquire(int arg) { 
  2.     if (!tryAcquire(arg) && 
  3.         acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) 
  4.         selfInterrupt(); 

還是3個方法,阿粉一個一個的說。

tryAcquire(arg) ,還是先看代碼在分析。

  1. final boolean nonfairTryAcquire(int acquires) { 
  2.     final Thread current = Thread.currentThread(); 
  3.     int c = getState(); 
  4.     if (c == 0) { 
  5.         if (compareAndSetState(0, acquires)) { 
  6.             setExclusiveOwnerThread(current); 
  7.             return true
  8.         } 
  9.     } 
  10.     else if (current == getExclusiveOwnerThread()) { 
  11.         int nextc = c + acquires; 
  12.         if (nextc < 0) // overflow 
  13.             throw new Error("Maximum lock count exceeded"); 
  14.         setState(nextc); 
  15.         return true
  16.     } 
  17.     return false

a. 獲取 state ,如果等于0,說明之前獲得鎖的線程已經釋放了,那么這個線程就會再次去競爭鎖,這就是非公平鎖的體現,如果是公平鎖,是沒有這個判斷的。

b. 如果前一個獲得鎖的線程沒有釋放鎖,那么就判斷是否是同一個線程,是的話就會將 state 加 1。這個就是重入鎖的體現。

c. 如果都不滿足,那么返回 false。

acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) ,再次獲取鎖沒有成功,并且又不是可重入鎖,那么就存入一個阻塞隊列里面。里面還有一點邏輯,就不展開了,有興趣可以自己看下。

selfInterrupt(); 這個是當前線程的中斷標志,作用就是在線程在阻塞的是否,客戶端通過調用了中斷線程的方法 interrupt(),那么該線程被喚醒的時候,就會有響應的處理。具體要看這個線程 run 方法里面的代碼邏輯。

2.4 unlock()

  1. protected final boolean tryRelease(int releases) { 
  2.     int c = getState() - releases; 
  3.     if (Thread.currentThread() != getExclusiveOwnerThread()) 
  4.         throw new IllegalMonitorStateException(); 
  5.     boolean free = false
  6.     if (c == 0) { 
  7.         free = true
  8.         setExclusiveOwnerThread(null); 
  9.     } 
  10.     setState(c); 
  11.     return free

state - 1,如果大于0,說明釋放的是重入鎖,只需要修改 state 就行了

如果等于0,說明要釋放鎖,釋放鎖首先需要把獨占線程設置為null,再把state設置為0。

3 總結

Lock 鎖的實現:

互斥性:需要一個狀態來判斷是否競爭到鎖:state 并且需要用 volatile修飾,保證線程之間的可見性。

可重入性:Thread exclusiveOwnerThread 這個成員變量來記錄當前獲得鎖的線程。

公平或非公平:默認非公平,NonfairSync。

沒有競爭到鎖的線程怎么辦?放到隊列中。

沒有競爭到鎖的線程怎么釋放CPU?park:阻塞線程釋放CPU資源,這個操作在 acquireQueued(),阿粉沒沒有講這個。

最后來張流程圖:

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2022-12-26 00:00:04

公平鎖非公平鎖

2024-12-03 00:35:20

2022-07-12 08:56:18

公平鎖非公平鎖Java

2022-05-09 07:37:04

Java非公平鎖公平鎖

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖

2023-10-07 08:17:40

公平鎖非公平鎖

2018-07-31 15:05:51

Java公平鎖線程

2021-08-20 07:54:20

非公平鎖 Java多線編程

2022-11-14 11:09:36

源碼AQS加鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-06-02 21:31:39

Synchronous非公平模式

2021-07-01 09:42:08

Redisson分布式

2022-06-15 15:14:17

Java公平鎖非公平鎖

2020-11-09 07:29:12

ReentrantLo源碼公平鎖

2022-12-08 17:15:54

Java并發包

2024-01-29 15:54:41

Java線程池公平鎖

2021-05-11 14:50:21

ReentrantLo可重入鎖Java

2023-08-28 07:49:24

Redisson鎖機制源碼

2023-07-06 08:06:47

LockCondition公平鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久综合av| 精品三级在线观看 | 国产成人精品免费视频 | 亚洲精品免费视频 | 视频一区二区三区中文字幕 | 国产精品久久久久久婷婷天堂 | www精品 | 久久久国产精品 | 国产999精品久久久 午夜天堂精品久久久久 | 欧美专区在线 | 日韩一区二区三区在线观看 | 欧美男人亚洲天堂 | 国产成人福利在线观看 | 国产一区二区精 | 成人午夜在线 | 在线观看中文字幕视频 | 国产精品一区二区欧美黑人喷潮水 | 亚洲精品久久久久中文字幕欢迎你 | 国产精品美女一区二区 | 日韩av在线一区 | 四虎影院免费在线 | 日日夜夜精品视频 | 欧美一区二区三区在线 | 永久免费视频 | 九色一区 | 精品粉嫩aⅴ一区二区三区四区 | 免费看一级毛片 | 欧美日韩亚洲一区二区 | 91成人| 99久久视频 | 一级黄色录像片子 | 日韩在线看片 | av一二三四 | 国产黄a一级 | 日韩精品一区二区三区在线播放 | 国产成人精品999在线观看 | 夜夜草| 日韩国产中文字幕 | 亚洲国产成人精品女人久久久 | 欧美日韩视频在线第一区 | 欧美伦理一区 |