并发教程--JAVA5中 计数信号量(COUNTING SEMAPHORE)例子

本文由 TonySpark 翻译自 Javarevisited转载请参见文章末尾的要求。

Java中的计数信息量(Counting Semaphore)是一个同步器,允许在资源上强加约束, 与其它常见的 CountDownLatch、CylicBarrier 和Exchanger等并发类一同被引入到Java 5 中。Java中的计数信息量保持着特定数量的通行证(Pass)或者许可(Permit)。为了访问共享资源,当前线程必需获取一个许可,此时如果其它线程已经使用了一个许可,那么只有当别的线程释放了一个许可,当前线程才能重新使用。 并发类对于实现生产者/消费设计模式或者像线程池、数据库连接池等这样的有界池(bounded Pool)或资源是非常有用的。Semaphore 这个类提供了 acquire() 和release()两个主要的方法用于获取和释放许可。 acquire()方法一直阻塞直到许可有效。 Semaphore 类提供了阻塞和非阻塞的方法去获取许可。这篇Java并发教程是一个非常简单的二进制信号量的例子并且演示了在Java中如何运用Semaphore来实现互斥。

Java中的计数信号量例子(二进制信号量)

计数信号量带有一个许可,常见的像:二进制信息量,它只有两个状态:有效的许可 或者 无效的许可。二进制信号量可以用于实现互斥或者实现那种只允许一个线程被执行当中的关键部分(critical section )【译者注:即访问和共享资源的代码】。线程在调用了acquire()方法时如果没有有效的许可只能等待,直到线程内部关键部分(critical section)调用了 信号量上的release()方法释放相应许可。

以下是Java中使用计数信号量的一个简单例子。在这个例子中我们使用二进制信号量提供互斥访问Java中的关键部分代码。

 1 import java.util.concurrent.Semaphore;
 2
 3 public class SemaphoreTest {
 4
 5     Semaphore binary = new Semaphore(1);
 6
 7     public static void main(String args[]) {
 8         final SemaphoreTest test = new SemaphoreTest();
 9         new Thread(){
10             @Override
11             public void run(){
12               test.mutualExclusion();
13             }
14         }.start();
15
16         new Thread(){
17             @Override
18             public void run(){
19               test.mutualExclusion();
20             }
21         }.start();
22
23     }
24
25     private void mutualExclusion() {
26         try {
27             binary.acquire();
28
29             //mutual exclusive region
30             System.out.println(Thread.currentThread().getName() + " inside mutual exclusive region");
31             Thread.sleep(1000);
32
33         } catch (InterruptedException i.e.) {
34             ie.printStackTrace();
35         } finally {
36             binary.release();
37             System.out.println(Thread.currentThread().getName() + " outside of mutual exclusive region");
38         }
39     }
40
41 }
42
43 Output:
44 Thread-0 inside mutual exclusive region
45 Thread-0 outside of mutual exclusive region
46 Thread-1 inside mutual exclusive region
47 Thread-1 outside of mutual exclusive region

信号量(Semaphore)可以用于如下情况:

1)可以实现更好的数据库连接池。如果没有可用的连接时,将会阻塞请求,而不至于让连接失败。同时,当存在可用的连接时,可以切换到这个可用的连接上。

2) 将集合类绑定。使用Semaphore去绑定一个集合类,你可以实现bounded 集合(bounded Collection),在集合中可以通过计数信号量 来指定bound 。【译者注:此段不是特别明白,故附上原文:To put a bound on collection classes. by using semaphore you can implement bounded collection whose bound is specified by counting semaphore.】

以上就是一些有关Java中的计数信号量的例子,Semaphore 是一个非常好用的并发类,它可以大大简化有限资源池(bounded resource pool)的设计与实现, Java 5 中已经添加了若干非常有用的并发类。非常值得大家深入研究下。

Java中计数信号量的重点部分:

1. Semaphore这个类中的 tryAquire()方法有多个重载实现。当调用这个方法期间,如果许可是有效的,就可以从信号量中获得这个许可

2. Semaphore类中另外一个值得注意的方法是 acquireUninterruptibly(),它是阻塞调用,等待直到存在可用的许可。

------------全文完

译者注:信号量(英语:Semaphore)又称为号志,它以一个整数变量,提供信号,以确保在并行计算环境中,不同进程在访问共享资源时,不会发生冲突。是一种不需要使用忙碌等待(busy waiting)的一种方法

原文链接: Javarevisited 翻译: TonySpark
译文链接: http://www.cnblogs.com/tonyspark/p/3716384.html

转载请保留原文出处、译者和译文链接。]

转载于:https://www.cnblogs.com/tonyspark/p/3716384.html

并发教程--JAVA5中 计数信号量(Counting Semaphore)例子相关推荐

  1. 面试官:说说Java中的信号量?Semaphore

    Semaphore (信号量)是由计算机科学家Dijkstra在1965年提出的,广泛应用不同的操作系统,在管程提出之前信号量就是并发编程领域的霸主!几乎所有并发的语言都支持信号量机制. Semaph ...

  2. java semaphore(0)_面试官:说说Java中的信号量?Semaphore

    Semaphore (信号量)是由计算机科学家Dijkstra在1965年提出的,广泛应用不同的操作系统,在管程提出之前信号量就是并发编程领域的霸主!几乎所有并发的语言都支持信号量机制. Semaph ...

  3. xsemaphoretake返回_【FreeRTOS操作系统教程】第21章 FreeRTOS计数信号量

    第21章 FreeRTOS计数信号量 本章节开始讲解FreeRTOS任务间的同步和资源共享机制,计数信号量.FreeRTOS中计数信号量的源码实现是基于消息队列实现的. 本章教程配套的例子含Corte ...

  4. xsemaphoretake返回_FreeRTOS 计数信号量

    本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的源码实现是基于消息队列实现的. 信号量的概念及其作用 信号量(semaphores)是 20 ...

  5. FreeRTOS 计数信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 FreeRTOS 任务间的同步和资源共享机制,计数信号量. FreeRTOS 中计数信号量的 ...

  6. java 并发 同步信号_Java并发教程–信号量

    java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...

  7. Java并发教程–信号量

    这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入探讨Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章将介绍信号量-特别是对信号 ...

  8. java控制并发数量_Java并发编程中级篇(二):使用Semaphore信号量进行多个资源并发控制...

    上一节中我们使用了Semaphore信号量保护共享资源,但是它只能保护一个共享资源,当我们需要同时保护多个共享资源的时候,我们只需要在创建信号量的时候使用new Semaphore(int)构造方法, ...

  9. Java并发编程中级篇(二):使用Semaphore信号量进行多个资源并发控制

    2019独角兽企业重金招聘Python工程师标准>>> 上一节中我们使用了Semaphore信号量保护共享资源,但是它只能保护一个共享资源,当我们需要同时保护多个共享资源的时候,我们 ...

最新文章

  1. KMP 中next 数组的性质
  2. 【spring-session】多项目实现session共享
  3. mean技术栈 linux,“MEAN”技术栈开发web应用
  4. Python并发编程理论篇
  5. 江苏省计算机一级题库软件百度云,江苏省计算机一级B题库11
  6. STC15W408读取HX711称重数据串口发送
  7. 天黑时间跟经度还是纬度有关_经纬度和时间有什么关系
  8. 使用Autodesk Vault插件向导轻松创建Vault插件
  9. umount强制卸载不起作用,卸载光驱终极办法---fuser
  10. 华为笔试题:词频统计
  11. 基于Matpower的电力系统潮流计算仿真
  12. ORACLE对字符串去空格处理(trim)
  13. “硬件极客”:树莓派Raspberrypi安装Kali Linux保姆教程(通过树莓派安装ARM Kali教程)
  14. 移植STM32F103VE程序到STM32F207VE系列应用注意事项
  15. Excel-甘特图制作
  16. Oracle数据库的锁类型
  17. Windows 11 配置Java 环境变量
  18. Chrome 图片批量下载扩展—— zzllrr Imager(小乐图客)
  19. 单片机原理与应用-51
  20. 《西线无战事》我们才刚开始热爱生活,却不得不对一切开炮

热门文章

  1. 学Python必看,Python中encode(),decode()的本质
  2. [leetcode]376. 摆动序列
  3. Brupsuit的安装与初步使用
  4. Unity3D基础27:C#随机函数与物体销毁
  5. matlab不用循环,三维矩阵按横切页(垂直于纸面且)向右展开为2维,即(i,j,:)展开。将二维矩阵每行顺序不变依次向左复制,如:(a,b,c)复制为(a,a,a,b,b,b,c,c,c)
  6. [机器学习] 概念解析:从经验风险、结构风险到代价函数、损失函数、目标函数
  7. 吴恩达神经网络和深度学习-学习笔记-20-训练/开发/测试集划分
  8. matlab简单分析频域滤波和时域滤波
  9. 关于 min_25 筛的入门以及复杂度证明
  10. js中window的属性