Java中Semaphore是一个同步类,它维护了指定数量的权限。当前线程需要访问共享内存时需要获取权限,如果该权限被其它线程占有将会等待直到释放权限。这种同步策略可以用来实现生产者消费者问题以及应用在线程池、数据库连接池中。
Semaphore类初始化时指定权限数,它提供了两个主要的方法acquire()和release()用于获取和释放权限。acquire()方法阻塞至有可用的权限,使用Semaphore可以实现线程间的互斥。
Semaphore使用实例
import java.util.concurrent.Semaphore;
public class SemaphoreTest{
Semaphore binary = new Semaphore(1);
public static void main(String[] args) {
final SemaphoreTest test = new SemaphoreTest();
new Thread(){
public void run(){
test.mutualExclusion();
}
}.start();
new Thread(){
public void run(){
test.mutualExclusion();
}
}.start();
}
private void mutualExclusion(){
try{
binary.acquire();
// mutual exclusive region
System.out.println(Thread.currentThread().getName() + " inside mutual exclusive region");
Thread.sleep(1000);
}catch (InterruptedException ie) {
ie.printStackTrace();
}finally{
binary.release();
System.out.println(Thread.currentThread().getName() + " outside of mutual exclusive region");
}
}
}
output:
Thread-0 inside mutual exclusive region
Thread-0 outside of mutual exclusive region
Thread-1 inside mutual exclusive region
Thread-1 outside of mutual exclusive region