AQS理解之六,AQS的其他实现类
生活随笔
收集整理的這篇文章主要介紹了
AQS理解之六,AQS的其他实现类
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
AQS理解之六,AQS的其他實(shí)現(xiàn)類
1,ThreadPoolExecutor 中的 Worker 類
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(); }重寫了這幾個(gè)方法,可以看出來實(shí)現(xiàn)的是一個(gè)不可重入的鎖。
2,Semaphore 信號(hào)量類
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ù)量來代表信號(hào)量已經(jīng)使用的數(shù),如果大于0,則可以進(jìn)入,如果小于等于0,則阻塞住,不能獲取到信號(hào)量。
和ReentrantLock有點(diǎn)類似,如果acquire時(shí)不能進(jìn)入,則阻塞,并加入鏈表,在release時(shí)會(huì)將阻塞的節(jié)點(diǎn)unpark打開。
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打開。 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鎖的邏輯,我們可以繼承它來實(shí)現(xiàn)自己在多線程下的鎖。
總結(jié)
以上是生活随笔為你收集整理的AQS理解之六,AQS的其他实现类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AQS理解之五—并发编程中AQS的理解
- 下一篇: AQS理解之七——AQS中的条件队列