semaphore小伙伴们听过吗?这是多线程下的一种设施,今天我们就来解析一下它的用法和它有哪些作用。
semaphore概念及作用
具体的说,它叫做信号量(Semaphore),俗称信号灯,是在多线程环境下使用的一种设施, 一般负责协调各个线程, 以保证它们能够正确、合理的来使用公共资源。
semaphore是一种新的同步类,是一个计数信号。
以概念来说的话,信号量维护了一个许可集合,如若有需要,在许可可用之前,它可以阻塞每一个acquire(),之后,再获取该许可。
在信号量中,每添加一个release()许可,就可能释放一个正在阻塞的获取者,但是,它不是用的实际许可对象,semaphore只对可用许可的号码进行计数,采取相应行动。
在java多线程中,信号量经常被使用在多线程代码里,较为典型的就是数据库连接池。
semaphore用法
示例:
public class Semaphore { private ManualResetEvent waitEvent = new ManualResetEvent(false); private object syncObjWait = new object(); private int maxCount = 1; file: //最大资源数 private int currentCount = 0; file: //当前资源数 public Semaphore() {} public Semaphore(int maxCount) { this.maxCount = maxCount; } public bool Wait() { lock(syncObjWait) file: //只能一个线程进入下面代码 { bool waitResult = this.waitEvent.WaitOne();file: //在此等待资源数大于零 if (waitResult) { lock(this) { if (currentCount > 0) { currentCount--; if (currentCount == 0) { this.waitEvent.Reset(); } } else { System.Diagnostics.Debug.Assert(false, "Semaphore is not allow current count < 0"); } } } return waitResult; } } /**/ /// <summary> /// 允许超时返回的 Wait 操作 /// </summary> /// <param name="millisecondsTimeout"></param> /// <returns></returns> public bool Wait(int millisecondsTimeout) { lock(syncObjWait) // Monitor 确保该范围类代码在临界区内 { bool waitResult = this.waitEvent.WaitOne(millisecondsTimeout, false); if (waitResult) { lock(this) { if (currentCount > 0) { currentCount--; if (currentCount == 0) { this.waitEvent.Reset(); } } else { System.Diagnostics.Debug.Assert(false, "Semaphore is not allow current count < 0"); } } } return waitResult; } } public bool Release() { lock(this) // Monitor 确保该范围类代码在临界区内 { currentCount++; if (currentCount > this.maxCount) { currentCount = this.maxCount; return false; } this.waitEvent.Set(); file: //允许调用Wait的线程进入 } return true; } }
以上就是本篇文章的所有内容,对于一些java架构师知识还有什么迷惑的话,欢迎来到奇Q工具网了解详情。
推荐阅读: