`
y806839048
  • 浏览: 1125811 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Semaphore-信号灯机制

阅读更多

当我们创建一个可扩展大小的线程池,并且需要在线程池内同时让有限数目的线程并发运行时,就需要用到Semaphore(信号灯机制),Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目,它是一个计数信号量,从概念上讲,信号量维护了一个许可集合,如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可,每个release() 添加一个许可,从而可能释放一个正在阻塞的获取者。        

        在线程池内创建线程并运行时,每个线程必须从信号量获取许可,从而保证可以使用该项。该线程结束后,线程返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用acquire() 时无法保持同步锁定,因为这会阻止线程返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。下面通过一个例子加以说明:

 

[java] view plain copy
 
  1. public class SemaphoreTest {  
  2.     public static void main(String[] args) {  
  3.         ExecutorService service = Executors.newCachedThreadPool();  
  4.         final  Semaphore sp = new Semaphore(3);  
  5.         for(int i=0;i<5;i++){  
  6.             Runnable runnable = new Runnable(){  
  7.                     public void run(){  
  8.                     try {  
  9.                         sp.acquire();  
  10.                     } catch (InterruptedException e1) {  
  11.                         e1.printStackTrace();  
  12.                     }  
  13.                     System.out.println("线程" + Thread.currentThread().getName() +   
  14.                             "进入,当前已有" + (3-sp.availablePermits()) + "个并发");  
  15.                     try {  
  16.                         Thread.sleep((long)(Math.random()*10000));  
  17.                     } catch (InterruptedException e) {  
  18.                         e.printStackTrace();  
  19.                     }  
  20.                     System.out.println("线程" + Thread.currentThread().getName() +   
  21.                             "即将离开");                      
  22.                     sp.release();  
  23.                     //下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元  
  24.                     System.out.println("线程" + Thread.currentThread().getName() +   
  25.                             "已离开,当前已有" + (3-sp.availablePermits()) + "个并发");  
  26.                 }  
  27.             };  
  28.             service.execute(runnable);            
  29.         }  
  30.     }  
  31. }  
 

 

       该例子定义了一个newCachedThreadPool,在该Pool中利用for循环同时创建5个线程,现在通过Semaphore,创建一个只允许在线程池中有3个线程并发运行,sp.acquire()表示某个线程获得了一个信号灯,开始运行,在运行结束时,通过sp.release()还回这个信号灯,以便剩下的线程获得信号灯运行,sp.availablePermits()指的是当前信号灯库中有多少个可以被使用,由于例子中定义有3个信号灯,所以3-sp.availablePermits()就代表了当前有多少个线程在并发运行,上例运行结果如下:

 

[java] view plain copy
 
  1. 线程pool-1-thread-1进入,当前已有2个并发  
  2. 线程pool-1-thread-2进入,当前已有2个并发  
  3. 线程pool-1-thread-3进入,当前已有3个并发  
  4. 线程pool-1-thread-1即将离开  
  5. 线程pool-1-thread-1已离开,当前已有2个并发  
  6. 线程pool-1-thread-4进入,当前已有3个并发  
  7. 线程pool-1-thread-3即将离开  
  8. 线程pool-1-thread-3已离开,当前已有2个并发  
  9. 线程pool-1-thread-5进入,当前已有3个并发  
  10. 线程pool-1-thread-2即将离开  
  11. 线程pool-1-thread-2已离开,当前已有2个并发  
  12. 线程pool-1-thread-4即将离开  
  13. 线程pool-1-thread-4已离开,当前已有1个并发  
  14. 线程pool-1-thread-5即将离开  
  15. 线程pool-1-thread-5已离开,当前已有0个并发  

 

     

Semaphore作为互斥锁使用:

       当信号量初始化为 1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可,或零个可用的许可。按此方式使用时,与传统互斥锁最大不同就是在释放的时候并不是必须要拥有锁的对象释放,也可以由其他的对象释放,因为信号量没有所有权的概念。在某些专门的上下文(如死锁恢复)中这会很有用。

用信号量的方式(极端情况允许线程数1)实现的互斥锁,没有谁占有谁释放,这种通过限制线程数量的锁是线程执行完之后就释放,其他等待线程进入

Semaphore的构造方法有两种:

第一种:

 

[java] view plain copy
 
  1. Semaphore(int permits) //用给定的许可数和非公平的公平设置创建一个 Semaphore。  

       第一种构造方法创建的信号灯,现在在获取的时候是随机的,没有一定的顺序,例如上例中,在前三个线程中的一个运行完毕以后,释放一个信号灯,剩下的两个线程就会随机的一个线程得到这个信号灯而运行。

第二种:

 

[java] view plain copy
 
  1. Semaphore(int permits, boolean fair) //用给定的许可数和给定的公平设置创建一个 Semaphore  


      第二种构造方法可选地接受一个公平 参数。当设置为 false 时,此类不对线程获取许可的顺序做任何保证。特别地,闯入 是允许的,也就是说可以在已经等待的线程前为调用acquire() 的线程分配一个许可,从逻辑上说,就是新线程将自己置于等待线程队列的头部。当公平设置为 true 时,信号量保证对于任何调用acquire() 方法的线程而言,都按照处理它们调用这些方法的顺序(即先进先出;FIFO)来选择线程、获得许可。注意,FIFO 排序必然应用到这些方法内的指定内部执行点。所以,可能某个线程先于另一个线程调用了acquire(),但是却在该线程之后到达排序点,并且从方法返回时也类似。还要注意,非同步的tryAcquire() 方法不使用公平设置,而是使用任意可用的许可。
      通常,应该将用于控制资源访问的信号量初始化为公平的,以确保所有线程都可访问资源。为其他的种类的同步控制使用信号量时,非公平排序的吞吐量优势通常要比公平考虑更为重要。

分享到:
评论

相关推荐

    基于Web前端技术期末大作业源码+文档+高分项目+全部资料.zip

    【资源说明】 基于Web前端技术期末大作业源码+文档+高分项目+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    上市公司企业-处理结果数据.xlsx

    详细介绍及样例数据:https://blog.csdn.net/T0620514/article/details/144519707

    基于LSTM网络模型的新闻文本分类算法matlab仿真,区分真新闻和假新闻,包括程序,参考文献,中文注释,仿真操作步骤视频

    1.版本:matlab2022a。 2.包含:程序,程序中文注释,参考文献,仿真操作步骤(使用windows media player播放)。 3.领域:LSTM网络 4.仿真效果:仿真效果可以参考博客同名文章《基于LSTM网络模型的新闻文本分类算法matlab仿真,区分真新闻和假新闻》 5.内容:基于LSTM网络模型的新闻文本分类算法matlab仿真,区分真新闻和假新闻。随着互联网的迅猛发展,新闻信息呈爆炸式增长。然而,其中夹杂着大量虚假新闻,严重影响了公众获取准确信息的权益以及社会的稳定与和谐。因此,开发有效的新闻文本分类算法,准确区分真新闻与假新闻具有极为重要的现实意义。长短期记忆网络(LSTM)作为一种特殊的循环神经网络(RNN),在处理序列数据(如文本)方面具有独特优势,能够有效捕捉文本中的长期依赖关系,为新闻文本分类提供了有力的技术支持。 6.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。

    基于java+springboot+vue+mysql的论坛系统 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、vscode 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    基于java+springboot+vue+mysql的善筹网 源码+数据库+论文(高分毕业设计).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、vscode 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    基于 jsplumb 封装一个使用十分简单的流程图处理类

    基于 jsplumb 封装一个使用十分简单的流程图处理类

    基于C语言大作业,基于Qt框架(C++)和SQLite数据库的学生信息管理系统源码+文档+高分项目+全部资料.zip

    【资源说明】 基于C语言大作业,基于Qt框架(C++)和SQLite数据库的学生信息管理系统源码+文档+高分项目+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    公司部门计算机的跨交换机VLAN配置与实现

    内容概要:本文档详细介绍了Jan16公司技术部和财务部计算机的互联与隔离配置方法,主要内容包括网络拓扑规划、VLAN的创建与分配、Trunk端口的配置以及IP地址的设置等。通过在两台二层交换机上配置VLAN和Trunk模式,实现了部门内计算机的互联互通,同时确保了部门间的网络隔离,提高了数据安全性。 适用人群:网络管理员、IT技术人员、网络安全工程师等。 使用场景及目标:适用于需要在多楼层或多交换机环境下实现部门内部互联互通并保持部门间网络隔离的公司。目标是提高网络管理效率和数据安全性。 其他说明:本文档提供了详细的配置步骤和命令示例,方便读者理解和操作。在实施过程中,需要注意端口配置的准确性,以免出现网络故障。

    校园导游程序纯JAVA,后段 课设代码

    设计一个校园导游程序,为来访的客人提供各种信息查询服务:即查询任意两个景点之间的一条最短的简单路径。通过该题目的设计过程,可以加深理解图的基本概念、逻辑结构及存储结构,掌握图的重要应用——最短路径等算法的应用,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。JAVA(1)校园平面图采用邻接矩阵(或邻接表)表示,主要功能有:校园平面图邻接矩阵(或邻接表)的建立、路径的查询、最短路径的查找、显示输出等功能;(2)校园内景点不少于10个,算法对于合法的输入数据都能产生满足规格说明要求的结果;(3)一般情况下,校园的道路是双向通行的,可设校园平面图是一无向网,网中顶点表示校内各景点,以边表示路径,边上的权值存放路径长度等相关信息;(4)较高要求:显示校园平面图、显示邻接矩阵(或邻接表)、显示两地间最短

    VBA-020.按指定名称批量创建工作簿

    VBA-020.按指定名称批量创建工作簿

    毕业设计-基于Python的学生管理系统.rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    基于python的(bert)深度学习文本相似度检测系统设计源代码(完整前后端+mysql+说明文档+LW).zip

    (bert)深度学习文本相似度检测系统设计 环境说明: 开发语言:python Python版本:3.6.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:pycharm

    libyuv-0.0.1280-0.el6.x86_64.rpm

    libyuv-0.0.1280-0.el6.x86_64

    mmexport1734593037400.png

    mmexport1734593037400.png

    Java系统源码+高校教师科研管理系统

    Java系统源码+高校教师科研管理系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    基于树莓派OpenCV和PyQT的人脸识别项目文档+源码+全部资料+优秀项目.zip

    【资源说明】 基于树莓派OpenCV和PyQT的人脸识别项目文档+源码+全部资料+优秀项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!OpenCV

    基于AI的动物识别技术研究源代码(完整前后端+mysql+说明文档+LW).zip

    基于卷积神经网络来进行本次的AI动物识别模型的搭建,其最主要的目的是搭建一个能够快速识别动物的web网站,通过该网站的搭建可以更好的进行专业化的内容识别,可以为动物保护、动物搜救、环境生态保护等多项内容提供完整的服务。 环境说明: 开发语言:python Python版本:3.6.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:pycharm

    基于java+springboot+vue+mysql的农商对接系统 源码+数据库+论文(高分毕业设计)

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、vscode 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat

    基于OpenCV和TesseractOCRiOS的银行卡号识别文档+源码+全部资料+优秀项目.zip

    【资源说明】 基于OpenCV和TesseractOCRiOS的银行卡号识别文档+源码+全部资料+优秀项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!OpenCV

    STM32F103单片机连接A7680C通过4G网络远程更新STM32程序固件-OTA远程升级.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F103运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。

Global site tag (gtag.js) - Google Analytics