日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java并發(fā)編程之淺談ReentrantLock

瀏覽:26日期:2022-08-11 17:57:45
目錄一、首先看圖二、lock()跟蹤源碼2.1 非公平鎖實(shí)現(xiàn)2.1.1 tryAcquire(arg)2.1.2 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)2.2 公平鎖實(shí)現(xiàn)2.2.1 tryAcquire(arg)一、首先看圖

Java并發(fā)編程之淺談ReentrantLock

二、lock()跟蹤源碼

Java并發(fā)編程之淺談ReentrantLock

這里對(duì)公平鎖和非公平鎖做了不同實(shí)現(xiàn),由構(gòu)造方法參數(shù)決定是否公平。

public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync();}2.1 非公平鎖實(shí)現(xiàn)

static final class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563782823691L;final void lock() {if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread());else acquire(1); } protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires); }}

代碼量很少。首先compareAndSetState(0, 1)通過CAS(期望值0,新值1,內(nèi)存值stateOffset)

如果修改成功,即搶占到鎖,setExclusiveOwnerThread(Thread.currentThread());將AQS中的變量exclusiveOwnerThread設(shè)置為當(dāng)前搶占到鎖的線程,也就是圖中的ThreadA。 若沒有搶占成功,證明此時(shí)鎖被占用,執(zhí)行方法acquire(1);。

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

這里主要看兩個(gè)方法tryAcquire(arg)和acquireQueued(addWaiter(Node.EXCLUSIVE), arg)。當(dāng)滿足if條件后,會(huì)給當(dāng)前線程標(biāo)記一個(gè)interrupt狀態(tài)。

2.1.1 tryAcquire(arg)

這個(gè)方法又有多個(gè)實(shí)現(xiàn)。這里看NonfairSync非公平鎖。

Java并發(fā)編程之淺談ReentrantLock

protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires);}final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error('Maximum lock count exceeded'); setState(nextc); return true; } return false; }

在這個(gè)方法中,還不死心,首先會(huì)判斷下AQS中的state是否為0,為0也就是說距離上次嘗試獲取鎖到現(xiàn)在準(zhǔn)備進(jìn)入隊(duì)列(雙向鏈表)中這段時(shí)間內(nèi),鎖已經(jīng)被釋放,可以重新CAS嘗試獲取鎖。

如果當(dāng)前鎖還是被持有狀態(tài),就是state!=0,就會(huì)判斷,當(dāng)前線程是不是當(dāng)前持有鎖的線程exclusiveOwnerThread,如果是,則state+1,從這里可以看出state表示的是重入次數(shù)。

全部不滿足,返回false。

2.1.2 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)

addWaiter

private Node addWaiter(Node mode) { Node node = new Node(Thread.currentThread(), mode); // Try the fast path of enq; backup to full enq on failure Node pred = tail; if (pred != null) {node.prev = pred;if (compareAndSetTail(pred, node)) { pred.next = node; return node;} } enq(node); return node;}

tryAcquire(arg)返回false,證明當(dāng)前線程還是沒有獲取到鎖。那么就要進(jìn)入隊(duì)列等待了,首先addWaiter方法,將當(dāng)前線程封裝成一個(gè)Node,如果pred不為空,則將當(dāng)前節(jié)點(diǎn)做鏈表的尾部插入,同時(shí)為了防止在此期間前序節(jié)點(diǎn)已經(jīng)不在隊(duì)列中了,也會(huì)運(yùn)用CAS操作來執(zhí)行(期望值pred,新值node,內(nèi)存值tailOffset)。

如果前序節(jié)點(diǎn)為空,或者在CAS時(shí)發(fā)現(xiàn)前序節(jié)點(diǎn)已經(jīng)不存在了,則重新構(gòu)建鏈表,將當(dāng)前節(jié)點(diǎn)封裝的Node,加入到鏈表當(dāng)中。

private Node enq(final Node node) { for (;;) {Node t = tail;if (t == null) { // Must initialize if (compareAndSetHead(new Node()))tail = head;} else { node.prev = t; if (compareAndSetTail(t, node)) {t.next = node;return t; }} }}

加入完成后,返回當(dāng)前node節(jié)點(diǎn),進(jìn)入acquireQueued方法。

acquireQueued

final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try {boolean interrupted = false;for (;;) {//獲取到當(dāng)前node節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn) final Node p = node.predecessor(); //如果當(dāng)前的上個(gè)節(jié)點(diǎn)就是頭節(jié)點(diǎn),會(huì)再次嘗試獲取鎖 if (p == head && tryAcquire(arg)) { //獲取成功,將當(dāng)前節(jié)點(diǎn)置空,并成為新的頭節(jié)點(diǎn)setHead(node);//這個(gè)p已經(jīng)沒用了,防止內(nèi)存泄漏,直接指向null,下次GC時(shí)回收p.next = null; // help GC//不需要取消failed = false;//return false,不需要中斷當(dāng)前線程return interrupted; } if (shouldParkAfterFailedAcquire(p, node) &&parkAndCheckInterrupt())interrupted = true;} } finally {if (failed) cancelAcquire(node); }}

這里是一個(gè)自旋操作,首先拿到當(dāng)前線程封裝節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),如果滿足第一個(gè)if條件if (p == head && tryAcquire(arg)),證明上個(gè)節(jié)點(diǎn)為頭節(jié)點(diǎn),則此時(shí)當(dāng)前線程也會(huì)再次嘗試獲取鎖,獲取鎖成功,證明此時(shí)沒有別的線程在隊(duì)列中了,則將當(dāng)前node清空并設(shè)置為頭節(jié)點(diǎn),返回不需要中斷當(dāng)前線程。

在第二個(gè)if條件中if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt())。走到這里證明當(dāng)前線程不是第一個(gè)線程節(jié)點(diǎn),或者沒有搶占到鎖,shouldParkAfterFailedAcquire這個(gè)方法見名知意,在搶占失敗后是否需要park阻塞,里面主要是用于清理雙向鏈表中被取消的節(jié)點(diǎn)線程和未被阻塞的節(jié)點(diǎn)線程。

private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { int ws = pred.waitStatus;//獲取前置節(jié)點(diǎn)的等待狀態(tài) if (ws == Node.SIGNAL)//前置節(jié)點(diǎn)的等待狀態(tài)為-1,表示前置節(jié)點(diǎn)在隊(duì)列中阻塞,那么當(dāng)前節(jié)點(diǎn)也需要被阻塞在隊(duì)列中return true; if (ws > 0) {//前置節(jié)點(diǎn)等待狀態(tài)大于0,此前置節(jié)點(diǎn)已經(jīng)被取消,循環(huán)遍歷清除所有已被取消的節(jié)點(diǎn)。do { node.prev = pred = pred.prev;} while (pred.waitStatus > 0);pred.next = node; } else {//前置節(jié)點(diǎn)等待狀態(tài)小于等于0,且不等于-1,也就是沒有被阻塞也沒有被取消//則將前置節(jié)點(diǎn)設(shè)置為阻塞狀態(tài)。compareAndSetWaitStatus(pred, ws, Node.SIGNAL); } return false;} 前置節(jié)點(diǎn)的等待狀態(tài)為-1,表示前置節(jié)點(diǎn)在隊(duì)列中阻塞,那么當(dāng)前節(jié)點(diǎn)也需要被阻塞在隊(duì)列中 前置節(jié)點(diǎn)等待狀態(tài)大于0,此前置節(jié)點(diǎn)已經(jīng)被取消,循環(huán)遍歷清除所有已被取消的節(jié)點(diǎn)。 前置節(jié)點(diǎn)等待狀態(tài)小于等于0,且不等于-1,也就是沒有被阻塞也沒有被取消。則將前置節(jié)點(diǎn)設(shè)置為阻塞狀態(tài)。

到這里,基于非公平鎖的實(shí)現(xiàn)結(jié)束。

2.2 公平鎖實(shí)現(xiàn)

公平鎖和樂觀鎖的區(qū)別就在于,非公平鎖acquire(1)前會(huì)先嘗試獲取鎖,公平鎖直接acquire(1)。

static final class FairSync extends Sync {private static final long serialVersionUID = -3000897897090466540L;final void lock() { acquire(1);}}2.2.1 tryAcquire(arg)

在tryAcquire中也和非公平鎖有一定的區(qū)別。在當(dāng)前鎖沒有被占有時(shí)。非公平鎖不用考慮目前AQS隊(duì)列中的排隊(duì)情況,直接通過CAS嘗試獲取鎖。公平鎖會(huì)看目前隊(duì)列的狀態(tài),再來決定是嘗試占有鎖還是在隊(duì)列中等待。

protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error('Maximum lock count exceeded'); setState(nextc); return true; } return false;}

到此這篇關(guān)于Java并發(fā)編程之淺談ReentrantLock的文章就介紹到這了,更多相關(guān)Java ReentrantLock內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩美女精品| 亚洲欧洲日韩| 国产精品美女久久久久久不卡| 天堂成人国产精品一区| 亚洲欧美激情诱惑| 亚洲三级网站| 亚洲乱码视频| 久久av日韩| 天堂а√在线最新版中文在线| 久久精品青草| 日韩中文字幕一区二区三区| 日本欧美一区二区| 亚洲v天堂v手机在线| 91精品麻豆| 国产精品麻豆久久| 欧美日韩视频| 91成人精品观看| sm久久捆绑调教精品一区| 日韩一区二区三区免费| 亚洲欧美久久久| 日韩不卡一二三区| 国产精品原创| 久久99伊人| 麻豆国产欧美一区二区三区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日韩精品成人在线观看| 国产精品网址| 亚洲国产影院| 欧美亚洲网站| 色婷婷久久久| 日本成人在线一区| 福利在线免费视频| 一区免费视频| 久久精品一区| 亚洲二区三区不卡| 国产伦精品一区二区三区在线播放| 成人国产精选| 亚洲影视一区| 麻豆91精品91久久久的内涵| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 久久电影一区| 久久尤物视频| 欧美亚洲国产一区| 日韩视频一二区| av高清不卡| 欧美亚洲一区二区三区| 91精品1区| 精品视频高潮| 蜜臀av一区二区在线免费观看 | 欧美精品观看| 欧美91视频| 国产精品115| 亚洲免费成人| 麻豆网站免费在线观看| 日韩国产在线一| 欧美日韩激情| 日产精品一区二区| 人人爱人人干婷婷丁香亚洲| 亚洲第一区色| 岛国av在线播放| 国产精品日本一区二区不卡视频| 国产偷自视频区视频一区二区| sm久久捆绑调教精品一区| 国产精品毛片久久久| 亚洲在线成人| 精品国产第一福利网站| 国产情侣久久| 蘑菇福利视频一区播放| av亚洲一区二区三区| 国产精品蜜月aⅴ在线| 三级在线观看一区二区| 免费观看不卡av| 亚洲女同av| 电影91久久久| 久久av网址| 国产精品久久久久77777丨| 综合亚洲色图| 视频一区二区欧美| 亚洲激精日韩激精欧美精品| 日韩精品91| 成人精品高清在线视频| 欧美激情久久久久久久久久久| 亚洲精品观看| 亚洲一区日韩| 国产一区导航| 亚洲深夜福利| 亚洲中字黄色| 亚洲少妇在线| 国产精品女主播一区二区三区| 国产精品99一区二区| 欧美亚洲国产激情| 激情欧美国产欧美| 日本精品影院| 成人日韩在线观看| 午夜av成人| 久久香蕉国产| 免费av一区二区三区四区| 91精品韩国| 欧美日一区二区| 国产精品一区二区av交换| 国产情侣久久| 精品丝袜久久| 国产在线观看www| 色天使综合视频| 久久婷婷激情| 激情欧美丁香| 欧美中文日韩| 日本va欧美va欧美va精品| 国产欧美日韩视频在线| 欧美成人精品午夜一区二区| 久久一区视频| 丝袜美腿诱惑一区二区三区| 日韩欧美二区| 欧美手机在线| 水蜜桃久久夜色精品一区的特点| 亚洲在线久久| 欧美性www| 久久爱www成人| 日韩欧美网址| 日韩午夜电影| 亚洲精品日本| 国产精品成人3p一区二区三区| 国产一区二区三区四区大秀| 香蕉视频亚洲一级| 亚洲尤物在线| 日本欧美一区二区在线观看| 欧美国产三级| 国产一区二区久久久久| 久久夜夜操妹子| 久久福利一区| 国产情侣一区在线| 免费在线小视频| 久久都是精品| 国产精品观看| 91精品啪在线观看国产18| 亚洲资源网站| 动漫av一区| 久久亚洲图片| 精品国产一区二区三区av片| 性欧美69xoxoxoxo| 国产调教精品| 久久高清精品| 中文字幕一区二区三区四区久久 | zzzwww在线看片免费| av亚洲免费| 国产精品一区免费在线| 久久视频一区| 日韩美女精品| 久久国产毛片| 91免费精品国偷自产在线在线| 91日韩欧美| 亚洲精品伊人| 亚洲天堂一区二区| 久久国际精品| 自拍日韩欧美| 免费日韩成人| 欧美成人综合| 欧美黑人做爰爽爽爽| 美日韩精品视频| 国产一区国产二区国产三区 | 香蕉精品999视频一区二区| 久久97视频| 国产精品毛片在线看| 精品欠久久久中文字幕加勒比| 国产午夜精品一区二区三区欧美| 麻豆精品久久久| 免费成人在线影院| 日韩理论片av| 国产精品伦一区二区| 欧美 日韩 国产一区二区在线视频 | 麻豆精品99| 国产模特精品视频久久久久| 久久久久97| 深夜福利亚洲| 免费视频亚洲| 红杏一区二区三区| 日本久久一区| 久久福利精品| 久久伦理在线| 亚洲国产成人二区| 国产福利资源一区| 婷婷亚洲成人| 91高清一区| 久久人人99| 日韩不卡免费高清视频| 欧美交a欧美精品喷水| 亚洲不卡视频| 天使萌一区二区三区免费观看| 亚洲精品.com| 国产福利91精品一区二区| 日韩福利在线观看| 亚洲视频播放| 亚洲五月婷婷| 欧美成a人免费观看久久| 国产成人黄色| 成人在线免费观看91| 欧美激情日韩| 国产精品成人一区二区网站软件| 日韩一区二区三区精品视频第3页| 日韩亚洲精品在线|