Semaphore是什么
Semaphore是一个计数信号量,可以用于控制同时访问某个共享资源的线程数量。Semaphore内部维护了一个计数器,线程可以通过acquire()方法获取许可证,如果许可证不足则线程会被阻塞,直到有线程释放许可证,然后被阻塞的线程才能继续执行。Semaphore还提供了release()方法,用于释放许可证。
Semaphore的用法
①创建Semaphore对象: 可以通过Semaphore类的构造方法来创建Semaphore对象,指定初始许可证的数量。
Semaphore semaphore = new Semaphore(5); // 创建Semaphore对象,初始许可证数量为5
②获取许可证: 线程可以通过acquire()方法来获取许可证,如果许可证不足则线程会被阻塞,直到有线程释放许可证。
try {
semaphore.acquire(); // 获取许可证,如果许可证不足则线程会被阻塞
// 执行任务
System.out.println(Thread.currentThread().getName() + "线程获得许可证,开始执行任务");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放许可证
}
③释放许可证: 线程完成任务后,需要通过release()方法来释放许可证,让其他线程可以获取许可证。
semaphore.release(); // 释放许可证
总结
Semaphore可以用于控制并发线程的数量,限制同时访问某个共享资源的线程数量,从而避免了共享资源的竞争问题。在实际开发中,Semaphore通常用于实现连接池、资源池等并发控制场景。