semaphore
英[ˈseməfɔ:(r)]
美[ˈsɛməˌfɔr, -ˌfor]
n. 臂板信号系统,(铁道)臂板信号装置;

Semaphore 用法

信号量主要有两种用途:

  1. 保护一个重要(代码)部分防止一次超过 N 个线程进入。
  2. 在两个线程之间发送信号。

保护重要部分

如果你将信号量用于保护一个重要部分,试图进入这一部分的代码通常会首先尝试获得一个许可,然后才能进入重要部分(代码块),执行完之后,再把许可释放掉。比如这样:

[java] view plaincopy
  1. Semaphore semaphore = new Semaphore(1);
  2. //critical section
  3. semaphore.acquire();
  4. ...
  5. semaphore.release();

在线程之间发送信号

如果你将一个信号量用于在两个线程之间传送信号,通常你应该用一个线程调用 acquire() 方法,而另一个线程调用 release() 方法。
如果没有可用的许可,acquire() 调用将会阻塞,直到一个许可被另一个线程释放出来。同理,如果无法往信号量释放更多许可时,一个 release() 调用也会阻塞。
通过这个可以对多个线程进行协调。比如,如果线程 1 将一个对象插入到了一个共享列表(list)之后之后调用了 acquire(),而线程 2 则在从该列表中获取一个对象之前调用了 release(),这时你其实已经创建了一个阻塞队列。信号量中可用的许可的数量也就等同于该阻塞队列能够持有的元素个数。

公平

没有办法保证线程能够公平地可从信号量中获得许可。也就是说,无法担保掉第一个调用 acquire() 的线程会是第一个获得一个许可的线程。如果第一个线程在等待一个许可时发生阻塞,而第二个线程前来索要一个许可的时候刚好有一个许可被释放出来,那么它就可能会在第一个线程之前获得许可。
如果你想要强制公平,Semaphore 类有一个具有一个布尔类型的参数的构造子,通过这个参数以告知 Semaphore 是否要强制公平。强制公平会影响到并发性能,所以除非你确实需要它否则不要启用它。
以下是如何在公平模式创建一个 Semaphore 的示例:

[java] view plaincopy
  1. Semaphore semaphore = new Semaphore(1, true);

更多方法

java.util.concurrent.Semaphore 类还有很多方法,比如:

  • availablePermits()
  • acquireUninterruptibly()
  • drainPermits()
  • hasQueuedThreads()
  • getQueuedThreads()
  • tryAcquire()
  • 等等

这些方法的细节请参考 Java 文档。

转载于:https://www.cnblogs.com/panxuejun/p/8566027.html

cocurrent包semaphore信号量相关推荐

  1. 线程 信号量 java_JAVA多线程-Semaphore信号量

    一.概述 Semaphore(信号量) 是一个线程同步结构,用于在线程间传递信号,以避免出现信号丢失,或者像锁一样用于保护一个关键区域,可以控制同时访问的线程个数,并且通过acquire()方法获取一 ...

  2. Java并发编程中级篇(一):使用Semaphore信号量进行并发控制

    2019独角兽企业重金招聘Python工程师标准>>> Semaphore是一个二进制信号量,只有0和1两个值.如果线程想要访问一个共享资源,它必须先获得信号量.如果信号量的内部计数 ...

  3. pthread-win32 semaphore信号量总结

    最近的多线程 想实现这样的功能: 多线程Socket获得的数据 对其进行某种处理FuncA,但是FuncA比较耗时,希望能够单独独立出来,这样 接受和处理数据分开,但是FuncA处理数据不能放入一个线 ...

  4. Java Semaphore 信号量

    Java Semaphore 信号量 Semaphore 是一种基于计数的信号量.它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞.S ...

  5. Linux 信号量 源码,一文读懂go中semaphore(信号量)源码

    运行时信号量机制 semaphore 前言 最近在看源码,发现好多地方用到了这个semaphore. 本文是在go version go1.13.15 darwin/amd64上进行的 作用是什么 下 ...

  6. Java并发编程笔记之Semaphore信号量源码分析

    JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那 ...

  7. python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...

    前言:本博文是对Python并发编程之进程的知识延伸,主要讲解:守护进程.锁.信号量. 友情链接: 一.守护进程(daemon) 1.1 守护进程概念 首先我们都知道:正常情况下,主进程默认等待子进程 ...

  8. Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型

    代码实现 如题,使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型.本来是想只用信号量实现生产者消费者模型的,但是发现 只能在一个生产者和一个消费者之间,要在多个生产者和消费者模 ...

  9. 同步工具之Semaphore信号量

    Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源.Semaphore就相当于一个许可证,线程需要先通过acquire()方法获取该许可证, ...

最新文章

  1. 【数据库】兴唐第二十七节课之jdbc的使用
  2. 重载自增++和自减--运算符
  3. python解释器是什么-python解释器都有什么
  4. 移动web注意事项 转
  5. LeetCode Implement Trie(Prefix Tree)
  6. SpringBoot之使用Scheduled做定时任务
  7. JAVA 海啸_java线程总结
  8. Facebook的体系结构分析---外文转载
  9. 浅谈搜狗下拉词框优化推广的优势有哪些
  10. Ubuntu系统上为用户授予和删除sudo权限的方法
  11. bind2nd的注意事项 zz
  12. SQL语句基本用法格式
  13. 4am永远 鼠标按键设置_罗技的MX Master鼠标是苹果Mac系统下最好的鼠标
  14. 视觉素材-10 个值得珍藏的高清桌面壁纸网站
  15. 报错 Duplicate keys detected
  16. 查看 win 系统开机关机,启动时间
  17. HDU 6095 Rikka with Competition
  18. Android Label 标签
  19. 支持DISTINCT的通用分页存储过程(SQL2005)
  20. 一种基于嵌入式的多重识别门禁系统设计方案

热门文章

  1. 如何给Typora安装主题
  2. Struts2学习总结二
  3. Java8新特性 Optional类
  4. Java的主要就业方向
  5. 微信终端跨平台组件 Mars 系列(三)连接超时与IPPort排序
  6. 【译】Google's AutoML: Cutting Through the Hype
  7. 【译】Introduction to Byteball — Part 2: The DAG
  8. mupdf不支持x64_x86平台转x64平台关于内联汇编不再支持的解决
  9. pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展
  10. JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)