信号量(Semaphore)不是严格意义上的锁,而是一种同步工具,用于控制同时访问某个特定资源的线程数量。信号量是由计数器和等待队列组成,它维护一个可用的许可证数量,线程可以通过获取许可证来执行临界区代码,执行完成后再释放许可证。
Java 中的 Semaphore
类提供了对信号量的支持。主要有两种类型的信号量:
二进制信号量(Binary Semaphore):
-
二进制信号量只有两个状态,0 和 1。也称为互斥锁(Mutex),可以用于实现对临界区的互斥访问。
计数信号量(Counting Semaphore):
- 计数信号量可以有多个状态,取决于初始许可证的数量。它用于控制同时访问某个资源的线程数量。
import java.util.concurrent.Semaphore;public class SemaphoreExample {public static void main(String[] args) {// 创建一个计数信号量,初始许可证数量为2Semaphore 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;}@Overridepublic 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();}}}
}