下面我们来说一下java并发工具类。我们先来说一下Semaphore,就是信号量,在JDK1.5被引入,可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。在Semaphore内部维护了一组许可,通过构造函数指定许可的数量。
在访问资源之间,需要通过acquire方法获取许可,如果许可数量为0,则线程阻塞直到有许可。在访问资源后,调用release方法释放许可。
Semaphore其实也是通过AQS实现的,有一个内部类Sync,这个类继承了AbstractQueuedSynchronizer,我们来看一下这个类
Sync(int permits) {
setState(permits);
}
final int getPermits() {
return getState();
}
permits是许可的数量,调用cas修改state的值,获取许可。
看下acquire方法
public void acquire() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
调用AbstractQueuedSynchronizer的acquireSharedInterruptibly方法
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
如果cas修改state值成功,则获取到资源,否则加入队列,等待被唤醒。再看一下release方法
public void release() {
sync.releaseShared(1);
}
调用AbstractQueuedSynchronizer的releaseShared方法
public final boolean releaseShared(int arg) {
if (tryReleaseShared(arg)) {
doReleaseShared();
return true;
}
return false;
}
访问资源后,通过cas修改waitStatus的值,修改成功后释放资源,并唤醒队列首结点的线程,否则继续尝试cas操作。
Semaphore的分析就到这里了。