在Java多线程编程中,Semaphore是一种用于控制资源访问的机制。Semaphore允许您限制同时访问某个资源的线程数量。这在需要限制并发访问的情况下非常有用,例如数据库连接池或有限数量的线程池。
创建Semaphore
要使用Semaphore,首先需要创建一个Semaphore对象并指定许可证数量。许可证数量表示可以同时访问资源的线程数量。
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
public static void main(String[] args) {
int permits = 3; // 允许同时访问的线程数量
Semaphore semaphore = new Semaphore(permits);
}
}
获取许可证
要访问受Semaphore控制的资源,线程需要获取许可证。如果没有可用的许可证,线程将被阻塞,直到有可用的许可证为止。
try {
semaphore.acquire(); // 获取一个许可证
// 访问受Semaphore控制的资源
} catch (InterruptedException e) {
// 处理中断异常
} finally {
semaphore.release(); // 释放许可证
}
释放许可证
一旦线程完成对资源的访问,应该释放许可证以便其他线程可以访问它。
实战
以下是一个简单的示例,演示了如何使用Semaphore来控制并发访问资源:
如上,一次只能由一个线程对该放入进行写入操作。其他线程阻塞等待。当然synchronized也能实现这一功能,但是Semaphore相对更加灵活。