精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

干貨,深入剖析ReentrantLock源碼,推薦收藏

開發 前端
看完了ReentrantLock的所有源碼,是不是覺得ReentrantLock很簡單。由于加鎖流程的編排工作已經在父類AQS中實現,子類只需要實現具體的加鎖邏輯即可。

ReentrantLock和Synchronized都是Java開發中最常用的鎖,與Synchronized這種JVM內置鎖不同的是,ReentrantLock提供了更豐富的語義。可以創建公平鎖或非公平鎖、響應中斷、超時等待、按條件喚醒等。在某些場景下,使用ReentrantLock更適合,功能更強大。

前兩篇文章,我們分析了AQS的加鎖流程、以及源碼實現。當時我們就說了,AQS使用了模板設計模式,父類中定義加鎖流程,子類去實現具體的加鎖邏輯。所以大部分加鎖代碼已經在父類AQS中實現了,導致ReentrantLock的源碼非常簡單,一塊學習一下。

先看一下ReentrantLock怎么使用?

1. ReentrantLock的使用

/**
* @author 一燈架構
* @apiNote ReentrantLock示例
**/
public class ReentrantLockDemo {

public static void main(String[] args){
// 1. 創建ReentrantLock對象
ReentrantLock lock = new ReentrantLock();
// 2. 加鎖
lock.lock();
try {
// 3. 這里執行具體的業務邏輯
} finally {
// 4. 釋放鎖
lock.unlock();
}
}
}

可以看到ReentrantLock的使用非常簡單,調用lock加鎖,unlock釋放鎖,需要配置try/finally使用,保證在代碼執行出錯的時候也能釋放鎖。

ReentrantLock也可以配合Condition條件使用,具體可以翻一下前幾篇文章中BlockingQueue的源碼解析,那里面有ReentrantLock的實際使用。

再看一下ReentrantLock的類結構

2. ReentrantLock類結構

// 實現Lock接口
public class ReentrantLock implements Lock {

// 只有一個Sync同步變量
private final Sync sync;

// Sync繼承自AQS,主要邏輯都在這里面
abstract static class Sync extends AbstractQueuedSynchronizer {
}

// Sync的兩個子類,分別實現了公平鎖和非公平鎖
static final class FairSync extends Sync {
}
static final class NonfairSync extends Sync {
}

}

可以看出ReentrantLock的類結構非常簡單,實現了Lock接口。

類里面有兩個靜態內部類,分別實現公平鎖和非公平鎖。

看一下Lock接口中,定義了哪些方法?

public interface Lock {

// 加鎖
void lock();

// 加可中斷的鎖
void lockInterruptibly() throws InterruptedException;

// 嘗試加鎖
boolean tryLock();

// 一段時間內,嘗試加鎖
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

// 釋放鎖
void unlock();

// 新建條件狀態
Condition newCondition();
}

就是一些使用鎖的常用方法。

在上篇文章中瀏覽AQS源碼的時候,了解到AQS定義了一些有關具體加鎖、釋放鎖的抽象方法,留給子類去實現,再看一下有哪些抽象方法:

// 加獨占鎖
protected boolean tryAcquire(int arg){
throw new UnsupportedOperationException();
}
// 釋放獨占鎖
protected boolean tryRelease(int arg){
throw new UnsupportedOperationException();
}

// 加共享鎖
protected int tryAcquireShared(int arg){
throw new UnsupportedOperationException();
}
// 釋放共享鎖
protected boolean tryReleaseShared(int arg){
throw new UnsupportedOperationException();
}

// 判斷是否是當前線程正在持有鎖
protected boolean isHeldExclusively(){
throw new UnsupportedOperationException();
}

由于ReentrantLock使用的是獨占鎖,所以只需要實現獨占鎖相關的方法就可以了。

3.ReentrantLock源碼解析

3.1 ReentrantLock構造方法

// 默認的構造方法,使用非公平鎖
public ReentrantLock(){
sync = new NonfairSync();
}

// 傳true,可以指定使用公平鎖
public ReentrantLock(boolean fair){
sync = fair ? new FairSync() : new NonfairSync();
}

在創建ReentrantLock對象的時候,可以指定使用公平鎖還是非公平鎖,默認使用非公平鎖,顯然非公平鎖的性能更好。

先思考一個面試常考問題,公平鎖和非公平鎖是怎么實現的?

3.2 非公平鎖源碼

先看一下加鎖源碼:

從父類ReentrantLock的加鎖方法入口:

public class ReentrantLock implements Lock {
// 加鎖入口方法
public void lock(){
// 調用Sync中加鎖方法
sync.lock();
}
}

在子類NonfairSync的加鎖方法:

// 非公平鎖
static final class NonfairSync extends Sync {

// 加鎖
final void lock(){
// 1. 先嘗試加鎖(使用CAS設置state=1
if (compareAndSetState(0, 1))
// 2. 加鎖成功,就把當前線程設置為持有鎖線程
setExclusiveOwnerThread(Thread.currentThread());
else
// 3. 沒加鎖成功,再調用父類AQS中實際的加鎖邏輯
acquire(1);
}
}

加鎖邏輯也很簡單,先嘗試使用CAS加鎖(也就是把state從0設置成1),加鎖成功,就把當前線程設置為持有鎖線程。

設計者很聰明,在鎖競爭不激烈的情況下,很大概率可以加鎖成功,也就不用走else中復雜的加鎖邏輯了。

如果沒有加鎖成功,還是需要走else中調用父類AQS的acquire方法,而acquire又需要調用子類的tryAcquire方法。

調用鏈路就是下面這樣:

圖片

根據調用鏈路,實際的加鎖邏輯在Sync.nonfairTryAcquire方法里面。

abstract static class Sync extends AbstractQueuedSynchronizer {
// 非公平鎖的最終加鎖方法
final boolean nonfairTryAcquire(int acquires){
final Thread current = Thread.currentThread();
// 1. 獲取同步狀態
int c = getState();
// 2. state=0表示無鎖,先嘗試加鎖(使用CAS設置state=1
if (c == 0) {
if (compareAndSetState(0, acquires)) {
// 3. 加鎖成功,就把當前線程設置為持有鎖線程
setExclusiveOwnerThread(current);
return true;
}
// 4. 如果當前線程已經持有鎖,執行可重入的邏輯
} else if (current == getExclusiveOwnerThread()) {
// 5. 加鎖次數+acquires
int nextc = c + acquires;
// 6. 超過tnt類型最大值,溢出了
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
}

再看一下釋放鎖的調用流程,公平鎖和非公平鎖流程是一樣的,最終都是執行Sync.tryRelease方法:

圖片

abstract static class Sync extends AbstractQueuedSynchronizer {
// 釋放鎖
protected final boolean tryRelease(int releases){
// 1. 同步狀態減去釋放鎖次數
int c = getState() - releases;
// 2. 校驗當前線程不持有鎖,就報錯
if (Thread.currentThread() != getExclusiveOwnerThread())
throw new IllegalMonitorStateException();
boolean free = false;
// 3. 判斷同步狀態是否等于0,無鎖后,就刪除持有鎖的線程
if (c == 0) {
free = true;
setExclusiveOwnerThread(null);
}
setState(c);
return free;
}
}

再看一下公平鎖的源碼

3.3 公平鎖源碼

先看一下公平鎖的加鎖流程:

圖片

最終的加鎖方法是FairSync.tryAcquire,看一下具體邏輯:

static final class FairSync extends Sync {

// 實現父類的加鎖邏輯
protected final boolean tryAcquire(int acquires){
final Thread current = Thread.currentThread();
// 1. 獲取同步狀態
int c = getState();
// 2. state=0表示無鎖,先嘗試加鎖(使用CAS設置state=1
if (c == 0) {
// 3. 判斷當前線程是不是頭節點的下一個節點(講究先來后到)
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
// 4. 如果當前線程已經持有鎖,執行可重入的邏輯
} else if (current == getExclusiveOwnerThread()) {
// 5. 加鎖次數+acquires
int nextc = c + acquires;
// 6. 超過tnt類型最大值,溢出了
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}

// 判斷當前線程是不是頭節點的下一個節點(講究先來后到)
public final boolean hasQueuedPredecessors(){
Node t = tail;
Node h = head;
Node s;
return h != t &&
((s = h.next) == null || s.thread != Thread.currentThread());
}
}

公平鎖的釋放鎖邏輯跟非公平鎖一樣,上面已經講過。

4. 總結

看完了ReentrantLock的所有源碼,是不是覺得ReentrantLock很簡單。

由于加鎖流程的編排工作已經在父類AQS中實現,子類只需要實現具體的加鎖邏輯即可。

加鎖邏輯也很簡單,也就是修改同步狀態state的值和持有鎖的線程exclusiveOwnerThread。

責任編輯:武曉燕 來源: 一燈架構
相關推薦

2020-08-24 08:13:25

非公平鎖源碼

2020-11-09 07:29:12

ReentrantLo源碼公平鎖

2024-04-29 09:06:46

線程初始化源碼

2021-03-06 22:41:06

內核源碼CAS

2024-01-29 15:54:41

Java線程池公平鎖

2009-09-14 15:12:40

LINQ to XML

2010-05-25 12:59:00

Subversion

2009-07-06 10:44:45

JSP charset

2010-06-03 13:08:51

2011-06-03 13:48:18

JavaScript重構

2009-09-27 17:13:36

Hibernate V

2022-11-11 10:48:55

AQS源碼架構

2021-05-11 14:50:21

ReentrantLo可重入鎖Java

2019-04-18 10:00:29

Windows實用軟件

2010-06-17 14:35:03

設計模式 UML

2010-07-07 10:23:31

UML建模

2009-09-28 14:54:33

Hibernate映射

2011-07-11 17:38:42

JAVA

2010-01-26 17:53:30

Android代碼結構

2009-09-25 09:36:55

Hibernate核心
點贊
收藏

51CTO技術棧公眾號

老司机免费视频久久| av日韩精品| 欧美激情中文不卡| 亚洲r级在线观看| 日本熟妇毛耸耸xxxxxx| 亚洲自拍电影| 这里只有精品免费| 国产极品粉嫩福利姬萌白酱 | 精品亚洲一区二区三区四区五区| 精品www久久久久奶水| 国产午夜精品久久久久免费视| 国产成人综合亚洲网站| 日韩av电影免费观看高清| 色哟哟一一国产精品| 日韩三级视频| 日韩亚洲欧美高清| 亚洲高清在线免费观看| 国语对白在线刺激| 国产精品久久久久久久久动漫 | 日本人69视频| 亚洲天堂av在线| 成人免费在线观看入口| 欧美日本国产精品| 亚洲乱码国产乱码精品精软件| 日日摸夜夜添夜夜添亚洲女人| 精品国产一区二区三区在线观看 | 中文字幕乱码在线人视频| 一根才成人网| 亚洲午夜一区二区| 中文精品一区二区三区| 日本午夜在线| 成人午夜电影小说| 91网站免费观看| 久久久国产免费| 一区二区三区四区五区在线 | 日韩av无码中文字幕| 久久久久午夜电影| 一区二区亚洲欧洲国产日韩| 人妖粗暴刺激videos呻吟| 成人在线视频区| 欧美日韩一区高清| 男女啪啪网站视频| 国产精品迅雷| 精品福利樱桃av导航| 成年人视频大全| 91在线免费看| 日本一区免费视频| 日韩视频精品| 国产高清一级毛片在线不卡| 91欧美一区二区| 精品国产一区二区三区免费| 欧美熟妇交换久久久久久分类| 国产盗摄视频一区二区三区| 99国产在线| 国产农村妇女毛片精品| 国产一区二区视频在线| 成人精品在线视频| 国产精品无码AV| 狠狠网亚洲精品| 91久久在线播放| 国产又粗又黄又爽视频| 韩国欧美国产一区| 91在线免费看片| 亚洲黄色在线播放| 高清不卡一区二区| 国产精品免费在线播放| 特黄视频在线观看| 91麻豆免费观看| 欧洲一区二区日韩在线视频观看免费 | 亚洲国产精品成人av| 日韩av无码一区二区三区不卡| 国产欧美自拍一区| 亚洲欧洲日产国产网站| 欧美成人短视频| 亚洲九九视频| 久久人人爽人人爽人人片av高请 | 亚洲一级少妇| 色婷婷激情综合| 天堂一区在线观看| 久久国产精品美女| 亚洲精品久久久一区二区三区| 国产精品无码午夜福利| 日韩精品永久网址| 欧美黄色性视频| 中文字幕亚洲精品一区| 日本不卡视频一二三区| 91探花福利精品国产自产在线| 日韩一区免费视频| 久久久国产综合精品女国产盗摄| 亚洲欧美日韩国产yyy| 日韩精品分区| 一本大道久久a久久精二百| 午夜精品免费看| 高清一区二区三区| 日韩中文在线观看| 国产精品7777| 久久精品国产一区二区| 国产乱码精品一区二区三区日韩精品 | 亚洲天堂av网| 国产精品久久久精品四季影院| 一区二区毛片| 亚洲精品欧美日韩| 国产精品久久久久久久龚玥菲| 亚洲精品成人在线| 国产精品拍拍拍| 成人在线超碰| 日韩视频免费看| 精品国产xxx| 国产精品羞羞答答xxdd| 日韩欧美精品久久| 7777kkk亚洲综合欧美网站| 欧美日韩在线不卡| 亚洲中文字幕一区| 欧美精品18| 国产主播精品在线| 国产精品一区在线看| 一区二区不卡在线播放| 中文字幕av不卡在线| 美女一区二区在线观看| 久99久在线视频| 亚洲天堂手机在线| 久久久久久97三级| 黄色一级视频在线播放| 欧美二区观看| yellow中文字幕久久| 中文字幕乱码中文字幕| 久久精品日产第一区二区三区高清版| 欧美一级视频在线播放| 国产人与zoxxxx另类91| 最新69国产成人精品视频免费| 国产又大又黄视频| av福利精品导航| 国产一区二区三区在线免费| 91麻豆精品国产综合久久久| 国产亚洲xxx| 日日骚av一区二区| 99视频精品全部免费在线| 97超碰国产精品| 午夜久久av| 久久国产精品久久久久久久久久| 亚洲专区第一页| 欧美激情综合在线| 视色视频在线观看| 国产综合久久久| 日本三级久久久| 欧美白人做受xxxx视频| 色综合久久中文字幕| 成人免费毛片日本片视频| 中文字幕一区二区精品区| 成人xvideos免费视频| 在线国产91| 欧美日本一道本在线视频| 韩国一级黄色录像| 国产真实乱对白精彩久久| 91免费视频黄| 91精品尤物| 久久久久久中文| 欧洲成人一区二区三区| 午夜视频在线观看一区二区| 亚洲久久久久久| 久久亚洲国产精品一区二区| 日韩欧美视频一区二区| 精品国产美女a久久9999| 久久精品国产亚洲精品| 性中国古装videossex| 亚洲影院理伦片| 一区二区三区少妇| 日韩电影在线一区| 自拍偷拍亚洲色图欧美| 91蜜桃臀久久一区二区| 欧美孕妇性xx| av影片在线看| 日韩欧美亚洲国产另类| 日韩精品成人一区| 国产欧美日韩在线视频| 想看黄色一级片| 一区在线观看| 日本在线观看一区| 亚洲日日夜夜| 亚州精品天堂中文字幕| 国产高清自拍视频在线观看| 欧美一区二区播放| 一级片中文字幕| 国产精品久久久久aaaa樱花| 精人妻一区二区三区| 国产一区二区你懂的| 亚洲精品一区二区三区四区五区| 日韩欧美中文在线观看| 日本最新高清不卡中文字幕| av香蕉成人| 亚洲美女福利视频网站| 国产喷水福利在线视频| 日韩欧美国产高清91| 永久久久久久久| 久久先锋资源网| 中文字幕一二三区| 日韩精彩视频在线观看| 国产一区 在线播放| 精品一区不卡| 国产精品免费一区二区三区| 国产亚洲精彩久久| 欧美亚洲成人网| sm国产在线调教视频| 亚洲人成电影网| 精品久久久无码中文字幕| 91高清视频免费看| 国产性70yerg老太| 国产精品久久网站| 巨胸大乳www视频免费观看| 国产精品一区一区| 国产一级特黄a大片免费| 亚洲青色在线| 老司机午夜网站| 成人激情开心网| 久久riav| 97久久亚洲| 91中文字幕一区| 国产精品成人国产| 日韩免费精品视频| 交100部在线观看| 欧美国产乱视频| free性欧美hd另类精品| 一区二区三区四区视频| 韩国三级在线观看久| 久久久久久女乱国产| 亚洲h在线观看| 在线观看亚洲网站| 国产精品欧美一区二区三区| 午夜理伦三级做爰电影| 99re热视频这里只精品| 国产精品果冻传媒| 国产精品911| 一级黄色大片免费看| 精品亚洲porn| 成 人 黄 色 小说网站 s色| 麻豆久久一区二区| 我看黄色一级片| 热久久免费视频| 日日碰狠狠丁香久燥| 天堂蜜桃一区二区三区| 99热自拍偷拍| 在线亚洲免费| www一区二区www免费| 国产亚洲在线| 国产成人精品视频免费看| 99亚洲视频| 国内自拍在线观看| 香蕉久久a毛片| 国产免费人做人爱午夜视频| 亚洲综合国产激情另类一区| 中文字幕日本最新乱码视频| 欧美专区一区二区三区| av免费观看网| 久久久久久网| www.日本一区| 九色|91porny| 在线成人免费av| 懂色av一区二区三区免费看| 黄色免费看视频| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 久久精品国内一区二区三区| www,av在线| 成人性生交大片免费看视频在线| 国产伦精品一区二区免费| 26uuu国产电影一区二区| www色com| 亚洲激情自拍偷拍| 天天操天天干视频| 在线日韩av片| 国产区精品在线| 亚洲国产精品久久久久| 久久久久国产精品嫩草影院| 色偷偷偷亚洲综合网另类| 国产网站在线免费观看| 97久久久久久| 玖玖精品在线| 97人人澡人人爽| 日韩欧美在线精品| 一区二区三区四区国产| 极品av少妇一区二区| 久草综合在线观看| 国产精品一区二区久久不卡| 精品中文字幕在线播放| 国产精品久久久久久久久动漫| 久久高清无码视频| 欧美图区在线视频| 国精品人妻无码一区二区三区喝尿 | 日本黄色福利视频| 成熟亚洲日本毛茸茸凸凹| 亚洲精品国产熟女久久久| 亚洲精品国产a久久久久久| 国产www在线| 欧美一区二区成人| 二区三区在线| 欧美激情久久久久久| 日本精品裸体写真集在线观看| 91美女高潮出水| 久久成人高清| 中国女人做爰视频| 日本亚洲免费观看| www.男人天堂| 亚洲欧美一区二区三区极速播放 | 日日夜夜免费精品| 亚洲乱妇老熟女爽到高潮的片 | 亚洲精品国产精品国自产观看| 国产精品videosex极品| 日本 片 成人 在线| 99riav久久精品riav| √天堂中文官网8在线| 在线观看日产精品| 深爱五月激情五月| 久久亚洲私人国产精品va| 色尼玛亚洲综合影院| 狠狠干一区二区| 欧美精品国产一区| 日韩欧美亚洲另类| 中文字幕国产精品一区二区| 天堂网av手机版| 欧美哺乳videos| 国产盗摄在线观看| 国产精品亚洲美女av网站| 精品一区免费| 国产av国片精品| 成人午夜电影久久影院| 久久久99精品| 欧美一区二区三区电影| 午夜免费播放观看在线视频| 国产精品吊钟奶在线| 亚洲精品中文字幕99999| 成人免费观看cn| 成人丝袜高跟foot| 久久精品视频国产| 精品久久久久久久久久久院品网| 黄色网址在线免费播放| 91精品视频免费看| 久久精品国内一区二区三区水蜜桃| 黄色片在线免费| 国产片一区二区三区| 国产性生活视频| 亚洲欧美制服丝袜| 怡红院成人在线| 色综合视频二区偷拍在线 | 第一页在线视频| 一区二区三区在线播| 精品毛片在线观看| 欧美日本中文字幕| xxxx日韩| 国产白丝袜美女久久久久| 91视频www| 精品久久久久久久久久久国产字幕| 亚洲男人天堂古典| 色成人免费网站| 亚洲精品国产系列| 精品亚洲成a人在线观看| 午夜精品一区二区三区视频| 欧美一区在线视频| h片视频在线观看| 精品日本一区二区三区在线观看| 亚洲在线一区| 国产人妻大战黑人20p| 欧美日韩大陆一区二区| 中日韩高清电影网| 国产精品日韩一区二区免费视频| 日韩午夜免费| av网站免费在线看| 欧美高清视频不卡网| 久久青青色综合| 欧美高清视频一区二区三区在线观看| 日韩电影在线观看一区| 成人在线观看免费完整| 亚洲精品在线网站| 欧美福利在线播放| 中国一级大黄大黄大色毛片| 成人av免费网站| 国产乱码77777777| 美女久久久久久久久久久| 成人偷拍自拍| 超碰在线97免费| 一区二区久久久| 九一在线视频| 亚洲自拍小视频免费观看| 亚洲日本黄色| 男女男精品视频网站| 亚洲成人久久一区| 超碰这里只有精品| www插插插无码免费视频网站| 2021中文字幕一区亚洲| 国产精品玖玖玖| 欧美一级视频一区二区| 天天做天天爱天天综合网| 91黄色免费视频| 欧美久久免费观看| 毛片在线网站| 欧美少妇一区二区三区| 久久中文娱乐网| www.xxx国产| 国产精品免费网站| 亚洲精品在线二区| 成人三级视频在线观看| 日韩成人久久久|