网站首页 > 教程文章 正文
【死记硬背】
【概念】Semaphore即信号量,是一种计数器,用来保护一个或者多个共享资源的访问,它是并发编程的一种基础工具,用来控制同时访问的线程个数。
【原理】Semaphore实现临界区必须遵循三个步骤,首先,必须通过acquire()方法获得信号量;其次,使用共享资源执行必要的操作;最后,必须通过release()方法释放信号量。
Semaphore通过acquire()方法获取一个许可,如果没有就等待,而release()方法则释放一个许可。acquire()和release()是Semaphore的两个重要方法。
Semaphore的有参构造器Semaphore(int permits, boolean fair)提供了第二个传入参数,可以设置信号量是否为公平模式,如果传入的是false,那边就是非公平模式,如果传入的是true,则信号量是公平模式,默认是非公平模式。
【答案解析】
Semaphore的使用样例如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {
//线程池
ExecutorService exec= Executors.newCachedThreadPool();
//只能几个线程同时访问
final Semaphore semph = new Semaphore(3);
//模拟几个客户端访问
for(int index=1;index<10;index++) {
final int NO=index;
Runnable ru = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
//获取许可
semph.acquire();
System.out.println("accessing:"+NO);
Thread.sleep((long)(Math.random()*1000));
//访问完后,释放
System.out.println("release:"+NO);
semph.release();
}catch (Exception e) {
// TODO: handle exception
}
}
};
exec.execute(ru);
}
//退出线程池
exec.shutdown();
}
}
【温馨提示】
点赞+收藏文章,关注我并私信回复【面试题解析】,即可100%免费领取楼主的所有面试题资料!
猜你喜欢
- 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)