推荐答案
Semaphore 是 Java 并发编程中的一个工具类,用于控制对共享资源的访问。它通过维护一组许可证(permits)来实现对资源的并发访问控制。Semaphore 可以用于限制同时访问某个资源的线程数量,或者用于实现线程间的同步。
本题详细解读
Semaphore 的基本概念
Semaphore 是一个计数器,用于控制对共享资源的访问。它通过 acquire() 和 release() 方法来管理许可证的获取和释放。当一个线程调用 acquire() 方法时,如果 Semaphore 中有可用的许可证,线程将获取一个许可证并继续执行;如果没有可用的许可证,线程将被阻塞,直到有许可证可用。当一个线程调用 release() 方法时,它会释放一个许可证,使得其他等待的线程可以获取许可证并继续执行。
Semaphore 的使用场景
资源池管理:Semaphore 可以用于管理资源池,例如数据库连接池。通过设置 Semaphore 的许可证数量,可以限制同时访问数据库连接的线程数量,从而避免资源耗尽。
限流:在高并发场景下,Semaphore 可以用于限制同时处理请求的线程数量,从而防止系统过载。
线程同步:Semaphore 可以用于实现线程间的同步,例如控制多个线程按照特定顺序执行。
Semaphore 的代码示例
// www.javascriptcn.com code example
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final int MAX_PERMITS = 3;
private static Semaphore semaphore = new Semaphore(MAX_PERMITS);
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new Worker(i)).start();
}
}
static class Worker implements Runnable {
private int id;
public Worker(int id) {
this.id = id;
}
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("Worker " + id + " is working");
Thread.sleep(2000); // 模拟工作
System.out.println("Worker " + id + " has finished");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
}
}在这个示例中,Semaphore 被初始化为 3 个许可证,意味着最多有 3 个线程可以同时执行 Worker 任务。其他线程必须等待许可证被释放后才能继续执行。
Semaphore 的注意事项
公平性:Semaphore 可以设置为公平模式或非公平模式。在公平模式下,线程按照请求许可证的顺序获取许可证;在非公平模式下,线程可能会插队获取许可证。
许可证数量:Semaphore 的许可证数量可以在初始化时设置,也可以在运行时动态调整。
异常处理:在使用 Semaphore 时,需要注意处理
InterruptedException,以确保线程在阻塞时能够正确响应中断。
通过以上内容,我们可以了解到 Semaphore 在 Java 并发编程中的重要作用及其使用方式。