一.Semaphore介绍
Semaphore:字面意思是信号量,主要用来控制同时访问某个特定资源的操作数量或者某个操作的数量。
二.Semaphore常用操作函数
(1).构造函数:
public Semaphore(int permits)
public Semaphore(int permits, boolean fair)
第一个构造函数:permits指定允许许可的初始数量。第二个构造函数:fair=true,表示公平策略,当使用资源的时候采用先来先用;fair=false,表示不公平策略,当使用资源的时候采用完全随机。
(2).获取许可函数:
public void acquire() throws InterruptedException
public void acquire(int permits) throws InterruptedException
acquire函数主要用来申请资源。
(3).释放许可函数:
public void release()
public void release(int permits)
release函数主要用来释放许可资源。
三.举例
有三个线程ThreadA,ThreadB,ThreadC并行运行,线程ThreadA用来初始化变量num,当初始化完成的时候,线程ThreadB和ThreadC再获取初始化后的变量num。如何实现?
public class SemaphoreTest {
/**
* 定义一个信号量,该类内部维持了多个线程锁,可以阻塞多个线程,释放多个线程,线程的阻塞和释放是通过permit概念来实现的
* 线程通过semaphore.acquire()方法获取permit,如果当前semaphore 有permit 则分配给该线程,
* 如果没有则阻塞该线程直到semaphore调用release()方法释放permit构造函数中参数:permit(允许) 个数.
**/
private static Semaphore semaphore=new Semaphore(0);
private static int num;
public static void main(String[] args) {
Thread threadA = new Thread(){
@Override
public void run() {
try {
Thread.sleep(3000);
num = 1;
semaphore.release(2);//释放2个资源
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread threadB = new Thread(){
@Override
public void run() {
try {
semaphore.acquire();//申请资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"获取到num 的值为:"+num);
}
};
Thread threadC = new Thread(){
@Override
public void run() {
try {
semaphore.acquire();//申请资源
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"获取到num 的值为:"+num);
}
};
//开启线程
threadA.start();
threadB.start();
threadC.start();
}
}