2013-09-25 68 views

回答

2

A Semaphore有一定数量的可用许可证。如果调用acquire(int permits),则将从信号量中获取给定数量的许可证。如果信号量没有足够的许可证,该方法将阻止/暂停调用线程,直到有足够的许可证可用。

如果在信号量上调用了release(int permits),给定数量的许可证返回给信号量。如果线程正在等待许可(由于阻止acquire调用),它们被唤醒并尝试获得他们所请求的许可数量。

(在内部,许可证只是一个线程安全的数字计数器,减少或增加,永远不能为负)。

通常,aquire(int)是可中断,因此螺纹t,即在aquire(int)等待可以从另一个线程调用t.interrupt()中断。在这种情况下,阻止aquire呼叫由InterruptedException终止。如果使用方法aquireUninterruptibly而不是acquire,则这不起作用。

举一个例子,看看的JavaDoc:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html有关许可证的最大数量

一两件事:信号量初始化为一定数量的可用许可,但这并不意味着这是最大它可以拥有的许可证数量。理论上讲,一个线程可以释放更多的许可证(甚至不需要先拨打acquire即可发布许可证)。因此允许调用aquire(int)获得比信号量初始化更多的许可证,并且要求release(int)给出比信号量更多的许可证。这种调用的语义取决于程序员...

+0

谢谢我有想法 –