Semaphore 是 Java.util.concurrent 包中提供的一个线程同步工具类,它可以用来控制同时访问某个资源的线程数量。
Semaphore 代码示例 1 :
import java.util.concurrent.Semaphore;
public class SemaphoreExample { public static void main(String\[\] args) {
Semaphore semaphore \\\\= new Semaphore(3);
for (int i \\\\= 1; i <= 5; i++) {
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " 获取到许可");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName() + " 执行完毕");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
System.out.println(Thread.currentThread().getName() + " 释放许可");
}
}).start();
}
}
}
代码解析:
Semaphore
对象 semaphore
,初始值为 3,表示最多允许 3 个线程同时访问资源。Thread.sleep(2000)
模拟)。可能的输出结果:
Thread\-1 获取到许可 Thread\-2 获取到许可 Thread\-3 获取到许可 Thread\-1 执行完毕 Thread\-1 释放许可 Thread\-2 执行完毕 Thread\-2 释放许可 Thread\-3 执行完毕 Thread\-3 释放许可 Thread\-4 获取到许可 Thread\-4 执行完毕 Thread\-4 释放许可 Thread\-5 获取到许可 Thread\-5 执行完毕 Thread\-5 释放许可
在这个示例中,最多允许 3 个线程同时获取许可,其他线程需要等待有许可可用时才能获取。每个线程获取到许可后,执行一段时间后释放许可。请注意,输出的顺序可能会有所不同,因为线程的执行顺序是不确定的。
Semaphore 代码示例 2 :
下面是一个使用 Semaphore 模拟抢占停车位的代码示例: