semaphore 是 java 并发编程中控制多线程资源访问的机制,通过创建许可证来实现,初始化时指定许可证计数,表示线程可以同时访问受保护资源的数量,当线程尝试访问资源时,它会尝试获取许可证,如果没有可用许可证,线程将被阻塞,直到许可证可用。

Java 函数的并发和多线程中 Semaphore 的作用
Semaphore 是 Java 并发编程中的一个重要机制,用于在多线程场景下控制资源的访问。它通过为保护资源的共享数据结构创建许可证来实现这一点。
作用原理
Semaphore 初始化时会指定一个许可证计数,该计数表示最多有多少个线程可以同时访问受保护的资源。当一个线程尝试访问资源时,它会尝试获取 semaphore 上的一个许可证。如果可用,许可证会被授予,线程可以访问资源。如果没有许可证可用,线程将被阻塞,直到许可证可用为止。
实战案例
假设我们有一个共享资源,即一个队列。只有 5 个线程可以同时访问该队列。我们可以使用 Semaphore 来确保这一点:
对于一个刚进入PHP 开发大门的程序员,最需要的就是一本实用的开发参考书,而不仅仅是各种快速入门的only hello wold。在开发的时候,也要注意到许多技巧和一些“潜规则”。PHP是一门很简单的脚本语言,但是用好它,也要下功夫的。同时,由于PHP 的特性,我一再强调,最NB 的PHP 程序员都不是搞PHP 的。为什么呢?因为PHP 作为一种胶水语言,用于粘合后端 数据库和前端页面,更多需
立即学习“Java免费学习笔记(深入)”;
import java.util.concurrent.Semaphore;
import java.util.Queue;
public class Example {
private static final int MAX_ACCESS_COUNT = 5;
private static Semaphore semaphore = new Semaphore(MAX_ACCESS_COUNT);
private static Queue queue = new ConcurrentLinkedQueue<>();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> accessQueue()).start();
}
}
private static void accessQueue() {
try {
// 尝试获取一个许可证
semaphore.acquire();
// 访问队列
queue.add((int) (Math.random() * 100));
// 释放许可证
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} 在这种示例中,semaphore 被初始化为具有 5 个许可证。这确保了最多只有 5 个线程可以同时访问队列。其他线程将被阻塞,直到许可证可用为止。
结论
Semaphore 在控制并发访问共享资源方面非常有用。通过限制可以同时访问资源的线程数量,它有助于防止数据竞争和不一致。










