标签:style java 使用 io strong for ar 2014 art
信号量一般用于限制能够訪问一些(物理上或者逻辑上)的资源的并发线程数。
信号量初始化为1的时候,意味着它最多仅仅有一个同意可用,这样就能作为相互排斥独占锁使用。这样的很多其它地被称为二进制信号量(binary semaphore),由于它仅仅有两个状态:一个许可可用,或者0个许可可用。当使用这样的方式的时候,二进制信号量就有这样的属性(不像大部分锁的实现):锁能够被拥有者(就如信号量没有拥有者的概念)之外的另外线程释放。这样的属性在某些特殊的上下文中非常实用,比如死锁恢复。详细实现
先来看看Semaphore的构造函数:public Semaphore(int permits) { sync = new NonfairSync(permits); } public Semaphore(int permits, boolean fair) { sync = fair ? new FairSync(permits) : new NonfairSync(permits); }能够看到构造函数与ReentrantLock实现类似,都是依照fair參数分配创建不同的锁类,再来看看Semaphore的acquire和release的接口实现
public void acquire() throws InterruptedException { sync.acquireSharedInterruptibly(1); } public void release() { sync.releaseShared(1); }能够看到acquire和release的实现都是调用内部类Sync的方法实现,当然了,这些方法也就是AQS提供出来的获取和释放共享锁接口。接下来看看整个实现里最基本的内部类Sync的相关实现:
abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; Sync(int permits) { setState(permits); } 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) // overflow throw new Error("Maximum permit count exceeded"); if (compareAndSetState(current, next)) return true; } } //省略一些次要方法 } /** * 非公平版本号 */ static final class NonfairSync extends Sync { private static final long serialVersionUID = -2694183684443567898L; NonfairSync(int permits) { super(permits); } protected int tryAcquireShared(int acquires) { return nonfairTryAcquireShared(acquires); } } /** * 公平版本号 */ static final class FairSync extends Sync { private static final long serialVersionUID = 2014338818796000944L; FairSync(int permits) { super(permits); } protected int tryAcquireShared(int acquires) { for (;;) { if (hasQueuedPredecessors()) return -1; int available = getState(); int remaining = available - acquires; if (remaining < 0 || compareAndSetState(available, remaining)) return remaining; } } }为了方便了解主要逻辑,Sync类省略掉一些次要的方法。非公平版本号NonfairSync类和公平版本号FairSync类都继承于Sync类,Sync类继承于AQS类,NonfairSync和FairSync类都有相同的tryReleaseShared实现,仅仅只是在tryAcquireShared实现上有略微不同。
标签:style java 使用 io strong for ar 2014 art
原文地址:http://www.cnblogs.com/mengfanrong/p/3932773.html