并发教程--JAVA5中 计数信号量(Counting Semaphore)例子
并发教程--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
[ 转载请保留原文出处、译者和译文链接。]
posted on 2014-05-08 15:59 TonySpark 阅读(1347) 评论(0) 编辑 收藏 举报