精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

猫咪在线永久网站| 国产精品一区二区欧美| 鲁大师私人影院在线观看| 97在线观看免费观看高清 | 91中文字幕永久在线| 欧美aa在线| 久久精品官网| 亚洲网站视频福利| 老司机久久精品| 超碰超碰在线| 91一区在线观看| 97在线视频精品| 少妇的滋味中文字幕bd| 色综合视频一区二区三区44| 亚洲精品国产高清久久伦理二区| 亚洲在线观看视频网站| 国产一级特黄视频| 日韩激情图片| 精品免费日韩av| 欧美在线观看www| av网站无病毒在线| eeuss国产一区二区三区| 国产剧情日韩欧美| 国产一级理论片| 手机在线一区二区三区| 欧美调教femdomvk| 国产深夜男女无套内射| 日本ー区在线视频| 粉嫩嫩av羞羞动漫久久久| 国产成人福利网站| 国产一级一片免费播放| 三上亚洲一区二区| 91精品国产麻豆| 国产 福利 在线| 国内外激情在线| 久久精品水蜜桃av综合天堂| 国产精品毛片va一区二区三区| 艳妇乳肉豪妇荡乳av无码福利| 亚洲国产电影| 久久国产精品久久久久久| 欧美人妻一区二区三区 | 国产精品一区二区在线观看| 中文字幕一区二区人妻痴汉电车| 综合色一区二区| 色视频www在线播放国产成人 | 国产精品你懂的| 久久精品一区二区三区不卡免费视频 | 国产成人精品片| 黄色成人精品网站| 美女啪啪无遮挡免费久久网站| 黄色国产在线观看| 亚洲国产中文在线| 欧美不卡在线视频| 中文字幕一二三| 美女国产精品久久久| 欧美精品三级在线观看| 一区二区xxx| abab456成人免费网址| 一本久道久久综合中文字幕| 韩国无码av片在线观看网站| 欧美一区二区三区少妇| 99re这里只有精品首页| 精品日本一区二区三区| 成人午夜免费在线观看| 成人免费视频视频在线观看免费| 粉嫩av免费一区二区三区| 国产乱码精品一区二区| 狠狠色综合播放一区二区| 国产精品69av| 中文字幕激情视频| 老司机精品视频在线| 国产精品午夜一区二区欲梦| 在线免费观看高清视频| 久热精品在线| 国产不卡av在线免费观看| 波多野结衣激情视频| 日本欧美韩国一区三区| 91精品国产综合久久男男| 国产欧美综合视频| 精品一区二区免费视频| 91在线高清免费观看| 99热这里只有精品9| 国产精品亚洲成人| www.成人av.com| 天天干天天爽天天操| 久久久精品人体av艺术| 小说区图片区图片区另类灬| 麻豆网站在线| 亚洲综合免费观看高清在线观看| www.99热这里只有精品| 忘忧草在线日韩www影院| 欧美性猛xxx| 日韩一级理论片| 国产精品**亚洲精品| 精品欧美一区二区久久| 蜜桃精品一区二区| 欧洲美女日日| 日韩h在线观看| 亚洲a∨无码无在线观看| 欧美精品18| 538国产精品一区二区免费视频| 波多野结衣在线观看视频| 韩国一区二区在线观看| 91啪国产在线| 婷婷国产在线| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲色成人www永久在线观看| 欧美国产大片| 日韩精品中文字幕在线一区| 黄色正能量网站| 亚洲成人免费| 97视频在线播放| 在线观看一二三区| 97久久精品人人爽人人爽蜜臀| 亚洲一区二区三区在线观看视频 | 亚洲欧洲国产日本综合| 400部精品国偷自产在线观看| 草草视频在线| 欧美一区二区三区四区高清| 亚洲妇女无套内射精| 第四色在线一区二区| 综合久久五月天| 国产精品999在线观看| 精品亚洲国内自在自线福利| 久久超碰亚洲| 国精一区二区三区| 色综合av在线| 亚洲最大免费视频| 国内激情久久| 91啪国产在线| 午夜在线播放| 午夜精品一区在线观看| 中文字幕乱妇无码av在线| 欧美综合久久| 日韩免费av在线| 人人妻人人澡人人爽久久av| 国产精品麻豆视频| 久久久久国产精品熟女影院| 色狠狠一区二区三区| 中日韩美女免费视频网站在线观看 | 国产二区视频在线| 99视频这里有精品| 亚洲天堂av高清| 国产在线视频你懂的| 国产在线播放一区| 一区二区冒白浆视频| 电影一区电影二区| 亚洲欧美三级在线| 亚洲自拍一区在线观看| 91麻豆国产在线观看| 草草草视频在线观看| 亚洲午夜国产成人| 日韩一区在线视频| 怡红院成永久免费人全部视频| 久久综合色之久久综合| 国产精品va无码一区二区| 亚洲日本va午夜在线电影| 久久久www成人免费精品| 一二区在线观看| 久久精品一区四区| 男人日女人bb视频| 欧美热在线视频精品999| 97视频在线观看免费高清完整版在线观看 | 国产资源中文字幕| 欧美一区免费| 91中文精品字幕在线视频| 国产淫片在线观看| 日韩欧美国产三级电影视频| 欧美特黄一级片| 免费在线观看精品| 日本午夜精品一区二区三区| 欧美不卡高清一区二区三区| 国产午夜精品全部视频播放| 成年人视频免费| 久久久精品国产99久久精品芒果 | 欧美精品久久久久性色| 国产成a人亚洲精| 成人国产一区二区三区| 精品日产乱码久久久久久仙踪林| 欧美激情手机在线视频| 天堂影院在线| 欧美日韩在线视频观看| 草草影院第一页| 国产精品丝袜xxxxxxx| 国产在线资源一区| av电影一区| 北条麻妃一区二区三区中文字幕 | 九色porny丨入口在线| 亚洲图片欧洲图片av| 国产区精品在线| 天天综合色天天| 亚洲综合图片一区| 蜜臀av性久久久久蜜臀aⅴ流畅| 伊人久久青草| 澳门精品久久国产| 国产精品久久久久影院日本| 午夜视频在线看| 亚洲精品久久久久中文字幕欢迎你| 中文字幕精品无码一区二区| 亚洲欧洲av色图| aaaaa黄色片| 久久久久欧美精品| 男女裸体影院高潮| 另类春色校园亚洲| 国产成人精品视| 第一av在线| 色偷偷av亚洲男人的天堂| 天天射,天天干| 在线看国产一区| 久久久国产一级片| 99久久精品免费看| 亚洲视频在线观看一区二区三区| 精品免费视频| 国产精品一区二区欧美| 亚洲ww精品| 久久久久久久久91| 免费在线观看黄色网| 日韩电影中文字幕av| 亚洲一区二区三区高清视频| 狠狠久久五月精品中文字幕| 亚洲色图日韩精品| 97精品久久久午夜一区二区三区| 亚洲天堂2018av| 男女精品网站| 91免费黄视频| 亚洲一区在线| 亚洲一区精品视频| 欧美日韩一区二区三区不卡视频| 成人高清视频观看www| 欧美在线va视频| 欧美日韩国产999| 川上优的av在线一区二区| 精品成人在线观看| 国产日本精品视频| 欧美日韩精品久久久| 日韩黄色a级片| 26uuu精品一区二区三区四区在线| 成人高清在线观看视频| 极品美女销魂一区二区三区免费| 可以免费在线看黄的网站| 一区免费在线| 老子影院午夜伦不卡大全| 永久91嫩草亚洲精品人人| 女同一区二区| av不卡一区二区| 亚洲一区亚洲二区亚洲三区| 91麻豆精品国产综合久久久 | 亚洲国产婷婷香蕉久久久久久| aaa一区二区三区| 欧美日韩电影在线播放| 中文字幕码精品视频网站| 欧洲一区二区三区在线| 日本视频免费在线| 欧美日韩一区二区在线 | 国产 高清 精品 在线 a| 欧美一级大片在线视频| 国产日韩欧美一二三区| 色综合一区二区日本韩国亚洲| 国产女同一区二区| 欧美天堂一区二区| 国产精品久久久久久av福利| 91看片一区| 91精品久久久久久久久久久久久| 素人一区二区三区| 国产美女扒开尿口久久久| 日本亚洲欧洲无免费码在线| 成人免费视频97| 中文字幕成人| 99精品99久久久久久宅男| 国产成人aa在线观看网站站| 精品久久一区二区三区蜜桃| 妖精视频一区二区三区| 日本婷婷久久久久久久久一区二区| 国产一区日韩| 大地资源第二页在线观看高清版| 91精品一区国产高清在线gif| 老汉色影院首页| 亚洲二区视频| 四虎永久在线精品无码视频| 蜜臀99久久精品久久久久久软件| 国产免费中文字幕| 国产精品香蕉一区二区三区| 北京富婆泄欲对白| 国产清纯白嫩初高生在线观看91 | 三级在线播放| 正在播放国产一区| 女囚岛在线观看| 国产成人福利视频| 欧美三级一区| 欧美在线视频二区| 婷婷综合在线| 欧美日韩激情四射| 奶水喷射视频一区| 日本黄色www| av在线不卡电影| 一区二区黄色片| 亚洲视频中文字幕| 最新中文字幕一区| 91麻豆精品国产91久久久使用方法| 亚洲精品97久久中文字幕无码| 日韩高清欧美高清| h片在线免费观看| 久久免费精品视频| 久久天堂影院| 国产伦精品一区二区三区| 欧美日韩色图| 激情伊人五月天| 韩国v欧美v亚洲v日本v| 毛茸茸多毛bbb毛多视频| 亚洲少妇最新在线视频| 亚洲熟女综合色一区二区三区| 欧洲精品在线观看| 精品人妻无码一区二区三区蜜桃一 | 成人一区二区三| 成人自拍视频在线| 亚洲综合第一区| 日韩欧美亚洲综合| www.xxx国产| 国产一区二区三区在线观看网站| 日韩另类在线| 国产综合久久久久| 欧美一区二区三区高清视频| 精品人妻少妇一区二区| 国产一区二区三区综合| 精品无码国产污污污免费网站| 亚洲人123区| 这里只有精品国产| 亚洲欧洲免费视频| 黄色在线观看www| 国产精品免费一区二区三区观看| 久久中文视频| 玩弄japan白嫩少妇hd| 懂色av中文一区二区三区| 乱h高h女3p含苞待放| 在线观看成人小视频| 户外极限露出调教在线视频| 午夜欧美不卡精品aaaaa| av不卡一区二区| 蜜臀精品一区二区| 成人天堂资源www在线| 超碰手机在线观看| 欧美午夜片在线看| 成人三级黄色免费网站| 日本精品视频在线播放| 日韩高清三区| 国产在线青青草| 久久免费电影网| 日韩av大片在线观看| 日韩精品久久久久久福利| jizzjizz中国精品麻豆| 国产伦精品一区二区三区四区免费 | 手机成人在线| 美女一区二区三区| 亚洲色图27p| 欧美一级在线免费| 国产人成网在线播放va免费| 成人网在线观看| 永久亚洲成a人片777777| 香蕉视频在线观看黄| 一区二区三区欧美久久| 亚洲中文字幕一区二区| 日韩天堂在线视频| 日韩国产网站| 中文字幕第50页| 国产iv一区二区三区| 亚洲一区二区91| 亚洲韩国欧洲国产日产av | 97精品久久久中文字幕免费| 成人动态视频| 免费午夜视频在线观看| 97久久精品人人做人人爽| 黄色网址中文字幕| 久久精品视频在线| 风间由美一区二区av101 | www.涩涩爱| 欧美zozo另类异族| 激情aⅴ欧美一区二区欲海潮| 国产在线精品一区二区三区》| 丝袜亚洲另类欧美综合| 精品无码在线观看| 91精品国产麻豆国产自产在线| 91福利区在线观看| 日韩av一区二区三区在线 | 国产精品一区二区三区久久久| 97精品视频| 制服.丝袜.亚洲.中文.综合懂 | 久久久性生活视频| 国产日产欧美一区| 国产成人精品一区二区无码呦 | 国产亚洲小视频| 亚洲日本成人网| 久久久久毛片免费观看| 国产成人精品视频免费看| 亚洲欧洲精品成人久久奇米网| 少妇精品高潮欲妇又嫩中文字幕 | 国产毛片aaa| 日韩一区二区精品视频| 婷婷成人在线| 精品人妻一区二区乱码| 五月婷婷综合网|