java系列-Semaphore

信号量(Semaphore)不是严格意义上的锁,而是一种同步工具,用于控制同时访问某个特定资源的线程数量。信号量是由计数器和等待队列组成,它维护一个可用的许可证数量,线程可以通过获取许可证来执行临界区代码,执行完成后再释放许可证。

Java 中的 Semaphore 类提供了对信号量的支持。主要有两种类型的信号量:

二进制信号量(Binary Semaphore):

  • 二进制信号量只有两个状态,0 和 1。也称为互斥锁(Mutex),可以用于实现对临界区的互斥访问。

计数信号量(Counting Semaphore):

  • 计数信号量可以有多个状态,取决于初始许可证的数量。它用于控制同时访问某个资源的线程数量。
import java.util.concurrent.Semaphore;

public class SemaphoreExample {

    public static void main(String[] args) {
        // 创建一个计数信号量,初始许可证数量为2
        Semaphore semaphore = new Semaphore(2);

        // 创建并启动5个线程
        for (int i = 1; i <= 5; i++) {
            new WorkerThread(semaphore, "Thread-" + i).start();
        }
    }

    static class WorkerThread extends Thread {
        private final Semaphore semaphore;

        public WorkerThread(Semaphore semaphore, String name) {
            super(name);
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            try {
                // 获取许可证,如果没有可用许可证则阻塞等待
                semaphore.acquire();
                System.out.println(getName() + " is working");
                Thread.sleep(2000); // 模拟工作
                System.out.println(getName() + " is done working");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 释放许可证
                semaphore.release();
            }
        }
    }
}

你可能感兴趣的:(Java,java)