Semaphore 类的作用是什么?请举例说明

Semaphore(信号量)是一个计数器,用于管理对有限数量资源的访问。它是一种并发控制机制,可以用于限制某个特定资源的并发访问数量,从而避免由于过多的并发导致的资源耗尽或系统崩溃。

Semaphore 的主要用途如下:

  1. 限制并发访问数:当有多个线程需要访问有限数量的资源时,可以使用 Semaphore 对资源访问进行限制。例如,数据库连接池中的连接数量是有限的,通过 Semaphore 可以控制允许同时访问数据库的线程数。

  2. 实现线程同步:Semaphore 可以用于实现线程之间的同步,例如让多个线程按顺序执行。在这种情况下,Semaphore 的初始计数器值通常设为 1,表示只允许一个线程执行。

下面是一个简单的 Semaphore 示例,用于限制同时访问资源的线程数:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        int permits = 3; // 设置最大并发访问数
        Semaphore semaphore = new Semaphore(permits);
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        Runnable task = new Runnable() {
            @Override
            public void run() {
                try {
                    semaphore.acquire(); // 获取许可
                    System.out.println(Thread.currentThread().getName() + " 获得许可");
                    Thread.sleep(2000); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    semaphore.release(); // 释放许可
                    System.out.println(Thread.currentThread().getName() + " 释放许可");
                }
            }
        };

        for (int i = 0; i < 10; i++) {
            executorService.submit(task);
        }

        executorService.shutdown();
    }
}

在上述示例中,我们创建了一个具有 3 个许可的 Semaphore 对象,表示最多允许 3 个线程同时访问资源。我们使用 ExecutorService 创建了一个包含 10 个线程的线程池,但由于 Semaphore 的限制,只有 3 个线程可以同时执行任务。

发表评论

后才能评论