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 的基本概念和使用方法有所帮助。