日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java aqs源码_java中AQS源码分析

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java aqs源码_java中AQS源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AQS內部采用CLH隊列。CLH隊列是由節點組成。內部的Node節點包含的狀態有

static?final?int?CANCELLED?=??1;

static?final?int?SIGNAL????=?-1;

static?final?int?CONDITION?=?-2;

static?final?int?PROPAGATE?=?-3;

其中取消狀態表示任務的取消,SIGNAL狀態表示后續節點需要喚醒,CONDITION表示等待狀態,PROPAGRATE表示的是傳播狀態通常用于共享鎖的釋放。初始節點的狀態為0。

AQS中比較重要的操作包括:

public?final?void?acquire(int?arg);

public?final?void?acquireInterruptibly(int?arg);

public?final?void?acquireShared(int?arg);

public?final?void?acquireSharedInterruptibly(int?arg);

protected?boolean?tryAcquire(int?arg);

protected?int?tryAcquireShared(int?arg);

public?final?boolean?tryAcquireNanos(int?arg,?long?nanosTimeout)?throws?InterruptedException;

public?final?boolean?tryAcquireSharedNanos(int?arg,?long?nanosTimeout)?throws?InterruptedException;

其中:public final void acquire(int arg) {

if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))

selfInterrupt();

}

其中tryAcquire方法為抽象方法。不同的子類有不同的實現方式。AQS中該方法的實現知識拋出了一個異常。

final boolean acquireQueued(final Node node, int arg) {

boolean failed = true;//標記是否成功拿到資源

try {

boolean interrupted = false;//標記等待過程中是否被中斷過

//自旋的過程

for (;;) {

final Node p = node.predecessor();//拿到前驅

//如果前驅是head,即該結點已成老二,那么便有資格去嘗試獲取資源(可能是老大釋放完資源喚醒自己的,當然也可能被interrupt了)。

if (p == head && tryAcquire(arg)) {

setHead(node);//拿到資源后,將head指向該結點。所以head所指的標桿結點,就是當前獲取到資源的那個結點或null。

p.next = null; // setHead中node.prev已置為null,此處再將head.next置為null,就是為了方便GC回收以前的head結點。也就意味著之前拿完資源的結點出隊了!

failed = false;

return interrupted;//返回等待過程中是否被中斷過

}

//如果自己可以休息了,就進入waiting狀態,直到被unpark()

if (shouldParkAfterFailedAcquire(p, node) &&

parkAndCheckInterrupt())

interrupted = true;//如果等待過程中被中斷過,哪怕只有那么一次,就將interrupted標記為true

}

} finally {

if (failed)

cancelAcquire(node);

}

}

可以從該方法中看出。這里會繼續嘗試去獲取一下資源

private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {

int ws = pred.waitStatus;//拿到前驅的狀態

if (ws == Node.SIGNAL)

//如果已經告訴前驅拿完號后通知自己一下,那就可以安心休息了

return true;

if (ws > 0) {

/*

* 如果前驅放棄了,那就一直往前找,直到找到最近一個正常等待的狀態,并排在它的后邊。

* 注意:那些放棄的結點,由于被自己“加塞”到它們前邊,它們相當于形成一個無引用鏈,稍后就會被保安大叔趕走了(GC回收)!

*/

do {

node.prev = pred = pred.prev;

} while (pred.waitStatus > 0);

pred.next = node;

} else {

//如果前驅正常,那就把前驅的狀態設置成SIGNAL,告訴它拿完號后通知自己一下。有可能失敗,人家說不定剛剛釋放完呢!

compareAndSetWaitStatus(pred, ws, Node.SIGNAL);

}

return false;

}

在該方法中會檢測當前節點中前面的節點是否有CANCELLED狀態的如果有。待會兒后續的操作這些節點會被GC回收。

如果一切正常當前節點的前一個節點會被設置為SIGNAL狀態。

1 private final boolean parkAndCheckInterrupt() {

2???? LockSupport.park(this);//調用park()使線程進入waiting狀態

3???? return Thread.interrupted();//如果被喚醒,查看自己是不是被中斷的。

4 }

線程進入waiting狀態。線程被喚醒的方式有被unpark和被中斷。

public final boolean release(int arg) {

if (tryRelease(arg)) {

Node h = head;//找到頭結點

if (h != null && h.waitStatus != 0)

unparkSuccessor(h);//喚醒等待隊列里的下一個線程

return true;

}

return false;

}

這里tryRelease也是一個抽象方法不同的子類有不同的實現。

private void unparkSuccessor(Node node) 內部首先會設置當前節點的狀態為初始狀態。同時找到一個有效的后繼節點的狀態小于0的進行節點的釋放。?LockSupport.unpark(s.thread);//喚醒對應的線程。

總結

以上是生活随笔為你收集整理的java aqs源码_java中AQS源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 二区在线视频 | 午夜精品一区 | 成人字幕 | 亚洲a色| a天堂v| av一片 | 亚洲免费看黄 | 91久久亚洲 | 男女偷爱性视频刺激 | 国产精品免费视频一区二区 | 伊人激情影院 | 色综合免费 | 草逼国产 | 成人性生交大片免费看 | 亚洲AV无码精品自拍 | 伊人久久大香线蕉av一区 | 影音先锋亚洲资源 | 中文字幕a级片 | www狠狠操| 精品一区二区三区在线观看 | 男人天堂免费视频 | 国产九九热 | 老司机精品视频在线播放 | 麻豆影视在线 | www亚洲视频 | 中文字幕一二三 | 操极品女神 | 欧美一级片免费在线观看 | 欧美一级淫片免费视频魅影视频 | 日韩欧美国产精品 | 极品videosvideo喷水 | 操日本老妇| 猛1被调教成公厕尿便失禁网站 | 成人夜视频 | 五十路六十路七十路熟婆 | 免费黄色在线播放 | 国产日本一区二区 | 自拍偷拍专区 | 少妇欧美激情一区二区三区 | 中文字幕第十一页 | 国产裸体美女永久免费无遮挡 | 免费观看国产视频 | 久久黄色小视频 | 国产欧美激情视频 | 天天射天天舔 | 国产一区二区精品在线观看 | 成年丰满熟妇午夜免费视频 | 性感美女被爆操 | 不许穿内裤随时挨c调教h苏绵 | 成人午夜免费在线 | 日韩一区二区三区网站 | 成人午夜免费网站 | 亚洲国产成人一区二区精品区 | 射射射综合网 | 欧美日韩国产中文 | 欧美一性一乱一交一视频 | 日韩精品视频在线观看免费 | 97超碰人 | 亚洲精品视频中文字幕 | 在线播放视频高清在线观看 | 欧美韩国日本一区 | 久久久久久久久久久久久久久久久久久久 | 欧美日韩一区精品 | 国产专区一区 | 亚洲福利影院 | 草碰在线视频 | 天天夜夜人人 | 欧美a性| jiuse九色| 另类av小说 | 中文字幕国产一区 | 黄色一级视频 | 欧美日韩在线视频一区 | 午夜av剧场 | 国产看黄网站 | 九色影视 | 亚洲精品77777| 五月天激情视频 | 波多野结衣激情视频 | 综合在线播放 | 免费在线看黄网站 | 欧美视频一区二区三区四区 | 手机在线视频一区 | 国产一区高清 | 国产精品一级无码 | 国内精品国产成人国产三级 | 黄色片小视频 | 日韩精品视频网 | 国产在线欧美 | 国产亚洲精品久久久久久无几年桃 | 国内精品在线观看视频 | 亚洲AV无码国产精品午夜字幕 | 一二三四区在线 | 日韩av一级 | 日韩激情精品 | 欧美日韩一区二区三区四区五区六区 | 日本xxxxxxxxx18| 夜夜干夜夜 | 日本成人免费在线视频 |