Java 接口Semaphore 的使用
在 Java 中,Semaphore 是一种用于控制并发访问的工具,它可以限制同时访问的线程数量。Semaphore 通常用于限制对共享资源的访问,比如数据库连接池、线程池等。
Semaphore 的基本概念
Semaphore 维护了一个许可证数量,线程在获取许可证时会进行阻塞,直到获得许可证为止。当线程使用完许可证后,需要归还给 Semaphore。
Semaphore 的构造函数如下:
Semaphore(int permits)
Semaphore(int permits, boolean fair)
其中 permits 表示初始许可证数量,fair 表示是否公平地分配许可证(默认为 false)。
Semaphore 的主要方法包括:
acquire()
: 获取一个许可证,如果没有许可证则阻塞release()
: 释放一个许可证availablePermits()
: 返回当前可用的许可证数量
Semaphore 在实际应用中的示例
假设有一个旅行团,每个景点只能容纳一定数量的游客,我们可以使用 Semaphore 来控制游客的进出。
import java.util.concurrent.Semaphore;
public class TravelTour {
private Semaphore semaphore;
public TravelTour(int spots) {
semaphore = new Semaphore(spots);
}
public void visitSpot(String spot) throws InterruptedException {
semaphore.acquire();
System.out.println("游客进入 " + spot);
Thread.sleep(2000); // 模拟游览时间
System.out.println("游客离开 " + spot);
semaphore.release();
}
public static void main(String[] args) {
TravelTour tour = new TravelTour(3); // 每个景点最多容纳 3 个游客
for (int i = 1; i <= 5; i++) {
new Thread(() -> {
try {
tour.visitSpot("景点A");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
}
上面的例子中,我们创建了一个 TravelTour 类来模拟旅行团访问景点的场景。每个景点最多容纳 3 个游客,通过 Semaphore 控制访问。
旅行图示例
journey
title 旅行团行程
section 出发
等待出发: 准备中...
section 景点A
访问景点A: 游客进入 -> 游览时间 -> 游客离开
section 景点B
访问景点B: 游客进入 -> 游览时间 -> 游客离开
section 结束
旅行结束: 返回出发地
总结
Semaphore 是 Java 中用于控制并发访问的工具之一,通过限制许可证数量,可以有效控制线程的并发访问。在实际应用中,可以用 Semaphore 来管理共享资源的访问,避免出现竞争条件。希望本文对你理解 Semaphore 的基本概念和使用方法有所帮助。