浅析current包中的高级同步对象-Semaphore

前言:

atomic和locks包提供的Java类可以满足基本的互斥和同步访问的需求,但这些Java类的抽象层次较低,使用比较复杂。更简单的做法是使用java.util.concurrent包中的高级同步对象。

Semaphore:信号量

浅析current包中的高级同步对象-Semaphore

信号量一般用来表示数量有限的资源,每类资源有一个对象的信号量,信号量的值表示资源的可用数量。

在使用资源时,需要从该信号量上获取许可,成功获取许可,资源的可用数-1;完成对资源的使用,释放许可,资源可用数+1; 当资源数为0时,需要获取资源的线程以阻塞的方式来等待资源,或过段时间之后再来检查资源是否可用。

java.util.concurrent.Semaphore类,在创建Semaphore类的对象时指定资源的可用数

a、acquire(),以阻塞方式获取许可

b、tryAcquire(),以非阻塞方式获取许可

c、release(),释放许可。

d、accquireUninterruptibly(),accquire()方法获取许可以的过程可以被中断,如果不希望被中断,使用此方法。

其实我们如果看源码的就会知道所有的业务逻辑都是委托给Sync这个内部类来执行的。

浅析current包中的高级同步对象-Semaphore
下面来看一下简单例子
浅析current包中的高级同步对象-Semaphore
上图是获得许可,释放许可,打印可用的许可个数
浅析current包中的高级同步对象-Semaphore
当可活动的许可数量为0时,就会阻塞。