成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析

小編給大家分享一下Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)平泉,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

CLH同步隊(duì)列是一個(gè)FIFO雙向隊(duì)列,AQS依賴它來完成同步狀態(tài)的管理,當(dāng)前線程如果獲取同步狀態(tài)失敗時(shí),AQS則會將當(dāng)前線程已經(jīng)等待狀態(tài)等信息構(gòu)造成一個(gè)節(jié)點(diǎn)(Node)并將其加入到CLH同步隊(duì)列,同時(shí)會阻塞當(dāng)前線程,當(dāng)同步狀態(tài)釋放時(shí),會把首節(jié)點(diǎn)喚醒(公平鎖),使其再次嘗試獲取同步狀態(tài)。

在CLH同步隊(duì)列中,一個(gè)節(jié)點(diǎn)表示一個(gè)線程,它保存著線程的引用(thread)、狀態(tài)(waitStatus)、前驅(qū)節(jié)點(diǎn)(prev)、后繼節(jié)點(diǎn)(next),其定義如下:

static final class Node {
 /** 共享 */
 static final Node SHARED = new Node();

 /** 獨(dú)占 */
 static final Node EXCLUSIVE = null;

 /**
 * 因?yàn)槌瑫r(shí)或者中斷,節(jié)點(diǎn)會被設(shè)置為取消狀態(tài),被取消的節(jié)點(diǎn)時(shí)不會參與到競爭中的,他會一直保持取消狀態(tài)不會轉(zhuǎn)變?yōu)槠渌麪顟B(tài);
 */
 static final int CANCELLED = 1;

 /**
 * 后繼節(jié)點(diǎn)的線程處于等待狀態(tài),而當(dāng)前節(jié)點(diǎn)的線程如果釋放了同步狀態(tài)或者被取消,將會通知后繼節(jié)點(diǎn),使后繼節(jié)點(diǎn)的線程得以運(yùn)行
 */
 static final int SIGNAL = -1;

 /**
 * 節(jié)點(diǎn)在等待隊(duì)列中,節(jié)點(diǎn)線程等待在Condition上,當(dāng)其他線程對Condition調(diào)用了signal()后,改節(jié)點(diǎn)將會從等待隊(duì)列中轉(zhuǎn)移到同步隊(duì)列中,加入到同步狀態(tài)的獲取中
 */
 static final int CONDITION = -2;

 /**
 * 表示下一次共享式同步狀態(tài)獲取將會無條件地傳播下去
 */
 static final int PROPAGATE = -3;

 /** 等待狀態(tài) */
 volatile int waitStatus;

 /** 前驅(qū)節(jié)點(diǎn) */
 volatile Node prev;

 /** 后繼節(jié)點(diǎn) */
 volatile Node next;

 /** 獲取同步狀態(tài)的線程 */
 volatile Thread thread;

 Node nextWaiter;

 final boolean isShared() {
 return nextWaiter == SHARED;
 }

 final Node predecessor() throws NullPointerException {
 Node p = prev;
 if (p == null)
 throw new NullPointerException();
 else
 return p;
 }

 Node() {
 }

 Node(Thread thread, Node mode) {
 this.nextWaiter = mode;
 this.thread = thread;
 }

 Node(Thread thread, int waitStatus) {
 this.waitStatus = waitStatus;
 this.thread = thread;
 }
}

CLH同步隊(duì)列結(jié)構(gòu)圖如下:

Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析

入列

學(xué)了數(shù)據(jù)結(jié)構(gòu)的我們,CLH隊(duì)列入列是再簡單不過了,無非就是tail指向新節(jié)點(diǎn)、新節(jié)點(diǎn)的prev指向當(dāng)前最后的節(jié)點(diǎn),當(dāng)前最后一個(gè)節(jié)點(diǎn)的next指向當(dāng)前節(jié)點(diǎn)。代碼我們可以看看addWaiter(Node node)方法:

 private Node addWaiter(Node mode) {
 //新建Node
 Node node = new Node(Thread.currentThread(), mode);
 //快速嘗試添加尾節(jié)點(diǎn)
 Node pred = tail;
 if (pred != null) {
 node.prev = pred;
 //CAS設(shè)置尾節(jié)點(diǎn)
 if (compareAndSetTail(pred, node)) {
 pred.next = node;
 return node;
 }
 }
 //多次嘗試
 enq(node);
 return node;
 }

addWaiter(Node node)先通過快速嘗試設(shè)置尾節(jié)點(diǎn),如果失敗,則調(diào)用enq(Node node)方法設(shè)置尾節(jié)點(diǎn)

 private Node enq(final Node node) {
 //多次嘗試,直到成功為止
 for (;;) {
 Node t = tail;
 //tail不存在,設(shè)置為首節(jié)點(diǎn)
 if (t == null) {
 if (compareAndSetHead(new Node()))
 tail = head;
 } else {
 //設(shè)置為尾節(jié)點(diǎn)
 node.prev = t;
 if (compareAndSetTail(t, node)) {
 t.next = node;
 return t;
 }
 }
 }
 }

在上面代碼中,兩個(gè)方法都是通過一個(gè)CAS方法compareAndSetTail(Node expect, Node update)來設(shè)置尾節(jié)點(diǎn),該方法可以確保節(jié)點(diǎn)是線程安全添加的。在enq(Node node)方法中,AQS通過“死循環(huán)”的方式來保證節(jié)點(diǎn)可以正確添加,只有成功添加后,當(dāng)前線程才會從該方法返回,否則會一直執(zhí)行下去。

過程圖如下:

Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析

出列

CLH同步隊(duì)列遵循FIFO,首節(jié)點(diǎn)的線程釋放同步狀態(tài)后,將會喚醒它的后繼節(jié)點(diǎn)(next),而后繼節(jié)點(diǎn)將會在獲取同步狀態(tài)成功時(shí)將自己設(shè)置為首節(jié)點(diǎn),這個(gè)過程非常簡單,head執(zhí)行該節(jié)點(diǎn)并斷開原首節(jié)點(diǎn)的next和當(dāng)前節(jié)點(diǎn)的prev即可,注意在這個(gè)過程是不需要使用CAS來保證的,因?yàn)橹挥幸粋€(gè)線程能夠成功獲取到同步狀態(tài)。過程圖如下:

Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析

以上是“Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁標(biāo)題:Java并發(fā)J.U.C之AQS:CLH同步隊(duì)列的示例分析
本文鏈接:http://jinyejixie.com/article6/ppisig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站收錄、網(wǎng)站內(nèi)鏈微信公眾號、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

晋城| 翁牛特旗| 阿尔山市| 民权县| 始兴县| 海安县| 平果县| 永靖县| 申扎县| 清远市| 寻乌县| 青冈县| 手机| 正蓝旗| 龙泉市| 尚志市| 廊坊市| 临泽县| 许昌市| 河曲县| 遵义县| 长泰县| 华池县| 彭州市| 正定县| 沈丘县| 普兰县| 辽中县| 孟津县| 凤冈县| 元朗区| 金湖县| 福建省| 邛崃市| 会理县| 静海县| 孟连| 阳城县| 南涧| 定襄县| 沙河市|