Java并发编程(四) Semaphore

下面我们来说一下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的分析就到这里了。

你可能感兴趣的:(Java并发编程(四) Semaphore)