Semaphore信号量
Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。
如果计数器值为0,线程进入休眠。当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。
例如:停车场的车位 ,有空闲车位才可以停,没有空闲车位只能等待。
主要使用方法:
acquire() 从信号量获取一个许可,在提供一个许可之前一直将线程阻塞 否则线程被中断
release() 释放一个许可,将其返回给信号量
例子: 停车场有五个停车位 有十辆车要停
public class SemaphoreDemo {
public static void main(String[] args) {
//参数 许可数量 例有五个空停车位
Semaphore semaphore = new Semaphore(5);
//模拟10辆汽车 要停车 只能有五辆汽车同时停 其他车只能等待
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
//acquire()得到 成功拿到车位停车
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "抢到车位");
//停两秒钟的车
TimeUnit.SECONDS.sleep(2);
//离开车位
System.out.println(Thread.currentThread().getName() + "离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//release()释放
semaphore.release();
}
}).start();
}
}
}