Semaphore通过许可机制控制并发线程数,如示例中3个许可限制最多3线程执行任务,acquire()获取许可,release()释放许可,确保资源安全访问。
在Java中,Semaphore 是一种用于控制同时访问特定资源的线程数量的同步工具。它通过维护一组许可(permits)来实现并发量的限制。线程在执行关键操作前需要获取许可,执行完成后释放许可,从而实现对并发量的精确控制。
Semaphore 有两种模式:公平和非公平。默认是非公平模式,即不保证等待时间最长的线程优先获得许可。
主要方法包括:
int permits):一次获取多个许可。假设我们希望最多允许3个线程同时访问某个资源,可以通过以下方式实现:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
// 定义一个拥有3个许可的Semaphore
private static final Semaphore semaphore = new Semaphore(3);
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 尝试获取许可");
semaphore.acquire(); // 获取许可
System.out.println(Thread.currentThread().getName() + " 获得许可,开始执行任务");
// 模拟任务执行
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " 任务完成,释放许可");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release(); // 释放许可
}
}, "Thread-" + i).start();
}
}
}
在这个例子中,尽管启动了10个线程,但最多只有3个线程能同时执行任务,其余线程会等待前面的线程释放许可后才能继续。
Semaphore常用于以下场景:
需要注意的是: