什么是 Java 的 Semaphore?

Sherwin.Wei Lv7

什么是 Java 的 Semaphore?

回答重点

Semaphore (信号量)是 Java 并发包中的一个同步工具类,用于管理一组许可(permits)。每个许可可以被一个线程持有,当许可被持有时,其他线程需要等待才能获取许可。即可以限制同时访问特定资源的线程数量,确保在特定时刻只有有限数量的线程能够访问资源。

扩展知识

基本概念

  • 许可(Permits):表示可以访问资源的线程数量。Semaphore 对象内部维护了一个许可计数器,线程在访问资源时需要获取许可,访问完成后需要释放许可。
  • 获取许可(Acquire):线程通过 acquire() 方法尝试获取许可。如果没有足够的许可,线程将被阻塞直到有许可可用。
  • 释放许可(Release):线程在完成对共享资源的访问后,通过 release() 方法释放许可,使其他等待的线程可以获取许可。

它支持公平与非公平策略:

  • 公平(Fair):在公平模式下,线程按照请求许可的顺序获取许可,防止线程饥饿。但公平模式可能会导致性能下降。
  • 非公平(Unfair):非公平模式下,线程不保证按照请求许可的顺序获取许可,可以提高性能,但可能会导致某些线程长时间无法获取许可。

常见用法

限制访问数量:例如,限制数据库连接池中最大连接数。

1
2
3
4
5
6
7
Semaphore semaphore = new Semaphore(10);  // 允许最多10个线程访问
semaphore.acquire();
try {
// 访问共享资源
} finally {
semaphore.release();
}

控制并发执行:例如,限制同时执行的任务数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
Semaphore semaphore = new Semaphore(5);  // 允许最多5个线程同时执行任务
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
semaphore.acquire();
// 执行任务
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release();
}
}).start();
}
Comments