JAVA多线程--信号量(Semaphore)_.docx
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号量和多值信号量。单值信号量只能被一个线程获得,而多值信号量可以被多个线程获得。以停车场运作为例,停车场只有三个车位,三个车位都是空的。这时,如果来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必需在入口等待。 信号量的特性如下: * 信号量是一个非负整数(车位数),全部通过它的线程(车辆)都会将该整数减一。 * 当该整数值为零时,全部试图通过它的线程都将处于等待状态。 * 在信号量上我们定义两种操作:Wait(等待)和Release(释放)。 * 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么始终等下去,直到信号量大于一或超时。 * Release(释放)事实上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是由于加操作事实上是释放了由信号量守护的资源。 在Java中,还可以设置该信号量是否采纳公正模式,假如以公正方式执行,则线程将会按到达的挨次(FIFO)执行,假如是非公正,则可以后恳求的有可能排在队列的头部。 JDK中定义如下: ``` Semaphore(int permits, boolean fair) ``` 创 建 具 有 给 定 的 许 可 数 和 给 定 的 公 正 设 置 的Semaphore。 Semaphore当前在多线程环境下被扩放用法,操作系统的信号量是个很重要的概念,在进程掌握方面都有应用。Java并发库Semaphore可以很轻松完成信号量掌握,Semaphore可以掌握某个资源可被同时访问的个数,通过acquire()猎取一个许可,假如没有就等待,而release()释放一个许可。 例如,在Windows下可以设置共享文件的最大客户端访问个数。Semaphore实现的功能就类似厕全部5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是根据先来后到的挨次获得机会,这取决于构造Semaphore对象时传入的参数选项。 单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁复原的一些场合。 在Java中,使用Semaphore可以轻松地实现多线程环境下的资源访问控制,例如: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaPhore { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 final Semaphore semp = new Semaphore(5); // 模拟20个客户端访问 for (int index = 0; index < 50; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { // 等待获取许可 semp.acquire(); // 执行业务逻辑 System.out.println("thread " + NO + " is running"); // 释放许可 semp.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }; exec.execute(run); } } } ``` 在上面的示例代码中,我们使用Semaphore来限制同时访问的线程数目为5个,模拟20个客户端访问的情况下,每个客户端都需要等待获取许可,然后执行业务逻辑,最后释放许可。
- 粉丝: 1
- 资源: 25万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
- (源码)基于计算机系统原理与Arduino技术的学习平台.zip
- (源码)基于SSM框架的大学消息通知系统服务端.zip
- (源码)基于Java Servlet的学生信息管理系统.zip
- (源码)基于Qt和AVR的FestosMechatronics系统终端.zip