并发教程--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中的关键部分代码。

 import java.util.concurrent.Semaphore;

 public class SemaphoreTest {

     Semaphore binary = new Semaphore(1);

     public static void main(String args[]) {
final SemaphoreTest test = new SemaphoreTest();
new Thread(){
@Override
public void run(){
test.mutualExclusion();
}
}.start(); new Thread(){
@Override
public void run(){
test.mutualExclusion();
}
}.start(); } private void mutualExclusion() {
try {
binary.acquire(); //mutual exclusive region
System.out.println(Thread.currentThread().getName() + " inside mutual exclusive region");
Thread.sleep(1000); } catch (InterruptedException i.e.) {
ie.printStackTrace();
} finally {
binary.release();
System.out.println(Thread.currentThread().getName() + " outside of mutual exclusive region");
}
} } Output:
Thread-0 inside mutual exclusive region
Thread-0 outside of mutual exclusive region
Thread-1 inside mutual exclusive region
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

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

并发教程--JAVA5中 计数信号量(Counting Semaphore)例子的更多相关文章

  1. Java8并发教程:Threads和Executors

    来之:ImportNew 欢迎阅读我的Java8并发教程的第一部分.这份指南将会以简单易懂的代码示例来教给你如何在Java8中进行并发编程.这是一系列教程中的第一部分.在接下来的15分钟,你将会学会如 ...

  2. ava8并发教程:Threads和Executors

    原文地址  原文作者:Benjamin Winterberg 译者:张坤 欢迎阅读我的Java8并发教程的第一部分.这份指南将会以简单易懂的代码示例来教给你如何在Java8中进行并发编程.这是一系列教 ...

  3. FreeRTOS 计数信号量

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

  4. freeRTOS中文实用教程3--中断管理之计数信号量

    1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢 ...

  5. C#多线程--信号量(Semaphore)

    百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确.合理的使用公共资源.也是操作系统中用于控制进程同步互斥的量. Semaphore常用的方法有两个WaitOne()和Releas ...

  6. 线程中的同步辅助类Semaphore

    同步辅助类  线程池  并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已. 多线程并不是很难 需要你把代码写出来...然后分析运 ...

  7. 深入浅出 Java Concurrency (12): 锁机制 part 7 信号量(Semaphore)

      Semaphore 是一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能 ...

  8. 深入浅出 Java Concurrency (12): 锁机制 part 7 信号量(Semaphore)[转]

    Semaphore 是一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放 ...

  9. Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

    Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...

随机推荐

  1. 由sock引起的感想

    昨天晚上和同学聊天,他问我你敲了这么多TCP,UDP.到底掌握了什么,我说我敲了很多例子.对这两个模式很清晰,顺便练习了多进程,线程等等. 他说,这样不太好.我一直只是拿这两个例子在练习,没有真正的在 ...

  2. 在Android工程中导入外部动态连接库(so文件)

    假设要导入的so文件命为libtest.so,导入的方法如下: 给工程加入Native Support,将libtest.so复制到在jni文件夹下,在Android.mk文件中,加入以下代码: in ...

  3. 远程抓取win7 的用户登录时间

    protected void Page_Load(object sender, EventArgs e) { InvokeSystemPS("query user /server:192.1 ...

  4. gridview把textbox的值修改还是旧值的解决方法

    解决方法很简单,加上if(!IsPostBack) 就OK了,因为之前加载之前都会调用InitData(). protected void Page_Load(object sender, Event ...

  5. Keras AttributeError 'NoneType' object has no attribute '_inbound_nodes'

    问题说明: 首先呢,报这个错误的代码是这行代码: model = Model(inputs=input, outputs=output) 报错: AttributeError 'NoneType' o ...

  6. CF1088F Ehab and a weird weight formula【倍增】

    首先把点权归到边上,设点权较小的一个点是v,也就是(u,v)的边权是log2(dis(u,v))*a[v]+a[v]+a[u] 然后还有一个性质就是这棵树按点权最小点提起来就是一个堆 暴力是n^2的M ...

  7. 2017 Fzu校赛 [Cloned]

    A - Salty Fish 海边躺着一排咸鱼,一些有梦想的咸鱼成功翻身(然而没有什么卵用),一些则是继续当咸鱼.一个善良的渔夫想要帮这些咸鱼翻身,但是渔夫比较懒,所以只会从某只咸鱼开始,往一个方向, ...

  8. 记录错误:tomcat“socket close”错误

    Error running 'Tomcat 8.5.37': Unable to open debugger port (127.0.0.1:9562) 使用打开cmd.exe 输入 1)taskli ...

  9. js框架:vue

    vue是一套用于构建用户界面的渐进式框架,vue被设计为可以自底向上逐层应用,核心库只关注图层 待续.......

  10. git小白的学习

    1.1 Git介绍 1.1.1 什么是Git Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.Git 是 Linus Torvalds 为了帮助管理 Linux ...