Semaphore是计数信号量。Semaphore管理一系列许可证,每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证。每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而其实并没有实际的许可证这个对象,Semaphore只是维持了一个可获得许可证的数量。常用于限制获取某种资源的线程数量。
代码示例
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 6; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " 抢到车位");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName() + " 停车3秒后离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}, String.valueOf(i)).start();
}
}
执行结果
0 抢到车位
1 抢到车位
4 抢到车位
4 停车3秒后离开车位
5 抢到车位
1 停车3秒后离开车位
2 抢到车位
0 停车3秒后离开车位
3 抢到车位
3 停车3秒后离开车位
2 停车3秒后离开车位
5 停车3秒后离开车位