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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

AQS理解之六,AQS的其他实现类

發(fā)布時(shí)間:2024/9/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AQS理解之六,AQS的其他实现类 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AQS理解之六,AQS的其他實(shí)現(xiàn)類(lèi)

1,ThreadPoolExecutor 中的 Worker 類(lèi)

protected boolean tryAcquire(int unused) {if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}protected boolean tryRelease(int unused) {setExclusiveOwnerThread(null);setState(0);return true;}public void lock() { acquire(1); }public boolean tryLock() { return tryAcquire(1); }public void unlock() { release(1); }public boolean isLocked() { return isHeldExclusively(); }

重寫(xiě)了這幾個(gè)方法,可以看出來(lái)實(shí)現(xiàn)的是一個(gè)不可重入的鎖。

2,Semaphore 信號(hào)量類(lèi)

abstract static class Sync extends AbstractQueuedSynchronizer {private static final long serialVersionUID = 1192457210091910933L;Sync(int permits) {setState(permits);}final int getPermits() {return getState();}final int nonfairTryAcquireShared(int acquires) {for (;;) {int available = getState();int remaining = available - acquires;if (remaining < 0 ||compareAndSetState(available, remaining))return remaining;}}protected final boolean tryReleaseShared(int releases) {for (;;) {int current = getState();int next = current + releases;if (next < current) // overflowthrow new Error("Maximum permit count exceeded");if (compareAndSetState(current, next))return true;}}final void reducePermits(int reductions) {for (;;) {int current = getState();int next = current - reductions;if (next > current) // underflowthrow new Error("Permit count underflow");if (compareAndSetState(current, next))return;}}final int drainPermits() {for (;;) {int current = getState();if (current == 0 || compareAndSetState(current, 0))return current;}} }

使用state的數(shù)量來(lái)代表信號(hào)量已經(jīng)使用的數(shù),如果大于0,則可以進(jìn)入,如果小于等于0,則阻塞住,不能獲取到信號(hào)量。

和ReentrantLock有點(diǎn)類(lèi)似,如果acquire時(shí)不能進(jìn)入,則阻塞,并加入鏈表,在release時(shí)會(huì)將阻塞的節(jié)點(diǎn)unpark打開(kāi)。

3,CountDownLatch

首先看下CountDownLatch的構(gòu)造使用

CountDownLatch countDownLatch = new CountDownLatch(5);//構(gòu)造 countDownLatch.countDown();//計(jì)數(shù) countDownLatch.await();//等待完成 //構(gòu)造時(shí),實(shí)際上是設(shè)置了state為一個(gè)數(shù)。 Sync(int count) {setState(count); } //這里實(shí)際上就是一個(gè)release操作,每次都會(huì)將state原子性減一,并順便會(huì)將阻塞的節(jié)點(diǎn)unpark打開(kāi)。 public final boolean releaseShared(int arg) {if (tryReleaseShared(arg)) {doReleaseShared();return true;}return false; }protected boolean tryReleaseShared(int releases) {// Decrement count; signal when transition to zerofor (;;) {int c = getState();if (c == 0)return false;int nextc = c-1;if (compareAndSetState(c, nextc))return nextc == 0;}}//await方法實(shí)際上是計(jì)算state是否為0,如果不為0,則park阻塞等待直到為0 public final void acquireSharedInterruptibly(int arg)throws InterruptedException {if (Thread.interrupted())throw new InterruptedException();if (tryAcquireShared(arg) < 0)doAcquireSharedInterruptibly(arg); }protected int tryAcquireShared(int acquires) {return (getState() == 0) ? 1 : -1;}

使用state表示仍需要執(zhí)行的次數(shù),當(dāng)為0時(shí)結(jié)束阻塞

總結(jié)

AQS實(shí)現(xiàn)了一套公共的實(shí)現(xiàn)Java鎖的邏輯,我們可以繼承它來(lái)實(shí)現(xiàn)自己在多線程下的鎖。

總結(jié)

以上是生活随笔為你收集整理的AQS理解之六,AQS的其他实现类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。