云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

Java并发编程(18):使用Semaphore控制并发访问数

jxf315 2024-12-26 14:09:30 教程文章 29 ℃

Semaphore 是一个计数信号量,用来控制对某个特定资源的访问权限。它维护了一个许可证的计数,线程可以通过调用acquire()方法获取一个许可证,通过release()方法释放一个许可证。与CountDownLatch和CyclicBarrier不同,Semaphore可以用于控制同时访问资源的线程数量。

Semaphore适用于限制对共享资源的并发访问数量的场景。

示例

假设有5个用户都需要访问同一个资源,但因为这个资源有限,希望同一时刻最多允许2个用户访问此资源:

使用Semaphore实现这个需求:

import java.util.concurrent.Semaphore;

public class SemaphoreExample {
    public static void main(String[] args) {
        final Semaphore semaphore = new Semaphore(2); // 允许同时访问的线程数量

        for (int i = 0; i < 5; i++) {
            new Thread(new Worker(semaphore)).start();
        }
    }

    static class Worker implements Runnable {
        private final Semaphore semaphore;

        public Worker(Semaphore semaphore) {
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            try {
                semaphore.acquire(); // 获取许可证
                System.out.println(Thread.currentThread().getName() + " 正在访问资源。");
                Thread.sleep(1000); // 模拟资源访问时间
                System.out.println(Thread.currentThread().getName() + " 释放资源。");
                semaphore.release(); // 释放许可证
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

以上代码输出:

Thread-2 正在访问资源。
Thread-1 正在访问资源。
Thread-2 释放资源。
Thread-1 释放资源。
Thread-0 正在访问资源。
Thread-4 正在访问资源。
Thread-0 释放资源。
Thread-4 释放资源。
Thread-3 正在访问资源。
Thread-3 释放资源。
最近发表
标签列表