Semaphore,信号灯,也叫信号量,主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制,大家想一个生活中的例子,我们开车去超市买东西的时候,首先要把车停到超市的停车场中,停车场的车位是有限的,假设停车场有3个停车位,来了6辆车,总会有3辆车先抢到,后面的3辆车等待前边的3辆车开走后,才可以进入停车场停车,也就是java中多个线程抢多份有限的资源,我们来看一下6辆车抢三个停车位的demo。
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;public class SemaphoreDemo {
public static void main(String[] args) throws Exception {
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i < 7; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.err.println(Thread.currentThread().getName() + "\t抢到车位");
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.err.println(Thread.currentThread().getName() + "\t停了3秒后离开车位");
semaphore.release();}, "第" + i + "辆车").start();
}}
}
执行结果
第6辆车 抢到车位
第1辆车 抢到车位
第4辆车 抢到车位
第6辆车 停了3秒后离开车位
第2辆车 抢到车位
第1辆车 停了3秒后离开车位
第3辆车 抢到车位
第4辆车 停了3秒后离开车位
第5辆车 抢到车位
第2辆车 停了3秒后离开车位
第3辆车 停了3秒后离开车位
第5辆车 停了3秒后离开车位
demo中,初始化3个资源的Semaphore类,当线程抢到资源后,需要调用acquire方法,当处理完成后,再调用release方法,释放锁,通知其他线程,这样就完成了多个线程抢占多个资源的例子,怎么样,不是很复杂把。