Semaphore

Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

再以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。

更进一步,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。

  1. Semaphore(int permits, boolean fair)
  2. //创建具有给定的许可数和给定的公平设置的Semaphore。

还可以设置该信号量是否采用公平模式,如果以公平方式执行,则线程将会按到达的顺序(FIFO)执行,如果是非公平,则可以后请求的有可能排在队列的头部。

使用

Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.Semaphore;
  4.  
  5. public class SemaphoreTest {
  6. public static void main(String[] args) {
  7. // 线程池
  8. ExecutorService exec = Executors.newCachedThreadPool();
  9. // 只能5个线程同时访问
  10. final Semaphore semp = new Semaphore(5);
  11. // 模拟20个客户端访问
  12. for (int index = 0; index < 50; index++) {
  13. final int NO = index;
  14. Runnable run = new Runnable() {
  15. public void run() {
  16. try {
  17. // 获取许可
  18. semp.acquire();
  19. System.out.println("Accessing: " + NO);
  20. Thread.sleep((long) (Math.random() * 10000));
  21. // 访问完后,释放
  22. semp.release();
  23. //availablePermits()指的是当前信号灯库中有多少个可以被使用
  24. System.out.println("-----------------" + semp.availablePermits());
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. };
  30. exec.execute(run);
  31. }
  32. // 退出线程池
  33. exec.shutdown();
  34. }
  35. }
  1. Accessing: 0
  2. Accessing: 1
  3. Accessing: 2
  4. Accessing: 4
  5. Accessing: 6
  6. Accessing: 8
  7. -----------------0
  8. -----------------1
  9. Accessing: 3
  10. -----------------1
  11. Accessing: 5
  12. Accessing: 9
  13. -----------------0
  14. -----------------1
  15. Accessing: 7
  16. Accessing: 10
  17. -----------------0
  18. -----------------1
  19. Accessing: 11
  20. -----------------1
  21. Accessing: 12
  22. -----------------1
  23. Accessing: 13
  24. Accessing: 14
  25. -----------------0
  26. -----------------1
  27. Accessing: 15
  28. -----------------0
  29. Accessing: 16
  30. -----------------1
  31. Accessing: 17
  32. -----------------1
  33. Accessing: 18
  34. -----------------1
  35. Accessing: 19
  36. -----------------0
  37. Accessing: 20
  38. Accessing: 21
  39. -----------------0
  40. Accessing: 22
  41. -----------------0
  42. -----------------1
  43. Accessing: 23
  44. -----------------1
  45. Accessing: 24
  46. -----------------0
  47. Accessing: 25
  48. Accessing: 26
  49. -----------------0
  50. -----------------1
  51. Accessing: 27
  52. -----------------1
  53. Accessing: 28
  54. -----------------1
  55. Accessing: 29
  56. Accessing: 30
  57. -----------------0
  58. -----------------1
  59. Accessing: 31
  60. -----------------1
  61. Accessing: 32
  62. -----------------1
  63. Accessing: 33
  64. -----------------1
  65. Accessing: 34
  66. Accessing: 35
  67. -----------------0
  68. -----------------1
  69. Accessing: 36
  70. -----------------1
  71. Accessing: 37
  72. -----------------1
  73. Accessing: 38
  74. -----------------1
  75. Accessing: 39
  76. -----------------1
  77. Accessing: 40
  78. Accessing: 41
  79. -----------------0
  80. -----------------1
  81. Accessing: 42
  82. Accessing: 43
  83. -----------------0
  84. Accessing: 44
  85. -----------------0
  86. -----------------1
  87. Accessing: 45
  88. -----------------1
  89. Accessing: 46
  90. -----------------1
  91. Accessing: 47
  92. -----------------1
  93. Accessing: 48
  94. -----------------1
  95. Accessing: 49
  96. -----------------1
  97. -----------------2
  98. -----------------3
  99. -----------------4
  100. -----------------5

我是天王盖地虎的分割线

参考:http://www.cnblogs.com/linjiqin/archive/2013/07/25/3214676.html

Java信号量Semaphore的更多相关文章

  1. 《转》Java 信号量 Semaphore 介绍

    该文章转自:http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个 ...

  2. java 信号量Semaphore

    Semaphore 信号量主要用于约束多个线程可同时获取的物理上的或者逻辑上的资源数.比如用在各种池的设计中. 信号量用于管理这些资源的一个虚拟的管理凭据.线程在获取一个资源时,首先要获取一个资源的许 ...

  3. Java 信号量 Semaphore 介绍

       Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以 ...

  4. Java信号量 Semaphore 介绍

    一.介绍 Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore ...

  5. java多线程-Semaphore信号量使用

    介绍 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源. 概念 Semaphore分为单值和多值两种,前者 ...

  6. 转:【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

    载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153 在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作 ...

  7. Java中Semaphore(信号量)的使用

    Semaphore的作用: 在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了 ...

  8. java笔记--对信号量Semaphore的理解与运用

    java Semaphore 信号量的使用: 在java中,提供了信号量Semaphore的支持. Semaphore类是一个计数信号量,必须由获取它的线程释放, 通常用于限制可以访问某些资源(物理或 ...

  9. 【Java并发编程】:并发新特性—信号量Semaphore

    在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步.当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定 ...

随机推荐

  1. ActiveMQ_ActiveMQ安装与配置

    ActiveMQ安装与配置   1.环境: Windows XP apache-activemq-5.2.0-bin.zip   2.安装 解压缩到apache-activemq-5.2.0-bin. ...

  2. [原创]SpotLight性能监控工具使用介绍

    [原创]SpotLight性能监控工具使用介绍 1  Spotlight工具是什么? SpotLight 是由Quest公司出品的一款第三方性能监控的图形化工具.SpotLight有一些的产品诸如可以 ...

  3. Context Switching on the Cortex-M3

    http://coactionos.com/embedded%20design%20tips/2013/10/09/Tips-Context-Switching-on-the-Cortex-M3/ T ...

  4. 北大 ACM 分类 汇总

    1.搜索 //回溯 2.DP(动态规划) 3.贪心 北大ACM题分类2009-01-27 1 4.图论 //Dijkstra.最小生成树.网络流 5.数论 //解模线性方程 6.计算几何 //凸壳.同 ...

  5. NSLineBreakMode 的区别

    typedef enum {     UILineBreakModeWordWrap = 0,     UILineBreakModeCharacterWrap,     UILineBreakMod ...

  6. chrome主页被hao123篡改,怎么改回来?

    这两天因为下载个别小程序又把我的chrome的主页给篡改了,由于我现在使用的是任务栏快捷方式,没法右键属性,但我想应该和桌面快捷方式是一个道理,于是我找到任务栏文件夹C:\Users\Administ ...

  7. 一步一步学习ASP.NET 5 (一)-基本概念和环境配置

    编者语:时代在变,在csdn开博一年就发了那么的两篇文章.不管是什么原因都认为有愧了.可是今年重心都会在这里发表一些文章,和大家谈谈.NET, 移动跨平台,云计算等热门话题.希望有更好的交流. 好吧言 ...

  8. WMAppManifest.xml

    大家在编写Windows phone的程序的时候可能并没有关注WMAppManifest.xml,其实这个档案是记录了应用程式的相关属性描述,以及定义应用程式的功能性的..所以还是相当重要的一个文档, ...

  9. mysql 筛选重复项(单列或者多列同时重复)

    原文:https://blog.csdn.net/luyaran/article/details/80929026 -------------单列----------------------- SEL ...

  10. HelloWorld 之JasperReports初步

    在企业应用系统中,经常要输出各种格式的数据报表. 著名的开源项目<JasperReports可以很好的解决这个问题. 使用JasperReports可以在预先设定好格式的报表基础上进行数据的填充 ...