Java面试之JUC系列:Semaphore:信号量
Semaphore:信号量
概念
信号量主要用于两个目的
-
一个是用于共享资源的互斥使用 另一个用于并发线程数的控制
代码
我们模拟一个抢车位的场景,假设一共有6个车,3个停车位
那么我们首先需要定义信号量为3,也就是3个停车位
/** * 初始化一个信号量为3,默认是false 非公平锁, 模拟3个停车位 */ Semaphore semaphore = new Semaphore(3, false);
然后我们模拟6辆车同时并发抢占停车位,但第一个车辆抢占到停车位后,信号量需要减1
// 代表一辆车,已经占用了该车位 semaphore.acquire(); // 抢占
同时车辆假设需要等待3秒后,释放信号量
// 每个车停3秒 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
最后车辆离开,释放信号量
// 释放停车位 semaphore.release();
完整代码
/** * 信号量Demo */ public class SemaphoreDemo { public static void main(String[] args) { /** * 初始化一个信号量为3,默认是false 非公平锁, 模拟3个停车位 */ Semaphore semaphore = new Semaphore(3, false); // 模拟6部车 for (int i = 0; i < 6; i++) { new Thread(() -> { try { // 代表一辆车,已经占用了该车位 semaphore.acquire(); // 抢占 System.out.println(Thread.currentThread().getName() + " 抢到车位"); // 每个车停3秒 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 离开车位"); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 释放停车位 semaphore.release(); } }, String.valueOf(i)).start(); } } }
运行结果
0 抢到车位 2 抢到车位 1 抢到车位 2 离开车位 1 离开车位 3 抢到车位 0 离开车位 4 抢到车位 5 抢到车位 4 离开车位 3 离开车位 5 离开车位
看运行结果能够发现,0 2 1 车辆首先抢占到了停车位,然后等待3秒后,离开,然后后面 3 4 5 又抢到了车位