首页 / JAVA / Java并发编程之信号量
Java并发编程之信号量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java并发编程之信号量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2822字,纯文字阅读大概需要5分钟。
内容图文
![Java并发编程之信号量](/upload/InfoBanner/zyjiaocheng/1091/09150ace61b749cea023445cfd4a759e.jpg)
一、概述
技术信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数据。计数信号量可以用来实现资源池或者给一个容器限定边界。
信号量维护了一个许可集,许可的初始量通过构造函数传递给Semaphore。活动能够获取许可,并在使用之后释放许可,如果没有可用的许可,acquire方法会被阻塞,直到有可用的为止。每个release方法添加一个许可,从而可能释放一个正在阻塞的获取者。
计算信号量的一种退化形式是二元信号量:一个计数初始值为1的Semaphore,二元信号量可用作互斥锁。
二、应用场景
信号量可用来实现资源池,比如数据库连接池。示例代码如下:
class Pool { private static final int MAX_AVAILABLE = 100; privatefinal Semaphore available = new Semaphore(MAX_AVAILABLE, true); public Object getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } publicvoid putItem(Object x) { if (markAsUnused(x)) available.release(); } MyResource resource1=new MyResource("资源1"); MyResource resource2=new MyResource("资源2"); MyResource resource3=new MyResource("资源3"); protected MyResource[] items = new MyResource[]{resource1,resource2,resource3}; protectedboolean[] used = newboolean[MAX_AVAILABLE]; protectedsynchronized Object getNextAvailableItem() { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (!used[i]) { used[i] = true; return items[i]; } } returnnull; // not reached } protectedsynchronizedboolean markAsUnused(Object item) { for (int i = 0; i < MAX_AVAILABLE; ++i) { if (item == items[i]) { if (used[i]) { used[i] = false; returntrue; } elsereturnfalse; } } returnfalse; } } class MyResource { String resourceName; public MyResource(String resourceName) { this.resourceName=resourceName; } }
三、使用方法
构造函数:
Semaphore(int permits):创建具有给定许可数和非公平设置的Semaphore
Semaphore(int permits,boolean fair):此类的构造方法可选地接受一个公平 参数。当设置为 false 时,此类不对线程获取许可的顺序做任何保证。特别地,闯入是允许的,也就是说可以在已经等待的线程前为调用 acquire()
的线程分配一个许可,从逻辑上说,就是新线程将自己置于等待线程队列的头部。当公平设置为 true 时,信号量保证对于任何调用获取
方法的线程而言,都按照处理它们调用这些方法的顺序(即先进先出;FIFO)来选择线程、获得许可。注意,FIFO 排序必然应用到这些方法内的指定内部执行点。所以,可能某个线程先于另一个线程调用了 acquire
,但是却在该线程之后到达排序点,并且从方法返回时也类似。
Semaphore还提供一些其他方法:
- int availablePermits() :返回此信号量中当前可用的许可证数。
- int getQueueLength():返回正在等待获取许可证的线程数。
- boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
- void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
- Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
示例代码如下:
public class SemaphoreTest { public static void main(String[] args) { Semaphore semaphore=new Semaphore(3); for(int i=0;i<5;i++) { MyThread myThread=new MyThread("线程"+i, semaphore); myThread.start(); } } staticclass MyThread extends Thread { String name; Semaphore semaphore; public MyThread(String name,Semaphore semaphore) { this.name=name; this.semaphore=semaphore; } @Override publicvoid run() { try { semaphore.acquire(); System.out.println(name+"获取信号量,开始工作..."); Thread.sleep(3000); System.out.println(name+"工作结束"+",正在等待获取许可证的线程数:"+semaphore.getQueueLength()); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } finally { semaphore.release(); } } } }
执行结果如下:
四、参考资料
1、Java并发编程实践
原文:http://www.cnblogs.com/xujian2014/p/5367078.html
内容总结
以上是互联网集市为您收集整理的Java并发编程之信号量全部内容,希望文章能够帮你解决Java并发编程之信号量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。