网站首页 > 教程文章 正文
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 释放资源。
猜你喜欢
- 2024-12-26 进程间通信:共享内存和信号量的统一封装机制原理与实现
- 2024-12-26 python基础篇:多线程的基本使用 python3.9多线程
- 2024-12-26 介绍C#中的并发集合,并说明其在多线程编程中的作?
- 2024-12-26 Hystrix系列之信号量、线程池 信号量 线程池
- 2024-12-26 劳斯莱斯推出独一无二的Spectre Semaphore:车头泼墨,极致奢华
- 2024-12-26 Linux信号量(1)-SYSTEM V Linux信号量做进程同步
- 2024-12-26 什么是多线程同步?请列举多种多线程同步机制并?较它们的优缺点
- 2024-12-26 2 万字长文详解 10 大多线程面试题|原力计划
- 2024-12-26 进程间通信——POSIX 有名信号量与无名信号量
- 2024-12-26 Python并发编程:使用信号量Semaphore实现资源有限的并发场景
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)