信号量计数器和信号量方法之间的理解差异整数参数?

时间:2013-09-25 06:02:02

标签: java multithreading semaphore

我对Semaphore计数器和信号量方法的形式参数感到困惑,比如

acquire(int parameter)acquireUninterptbly(int parameter)release(int parameter)

如果参数大于信号量计数器,反之亦然,会发生什么     如果有人通过实时示例解释,那将非常有帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

举个例子,看看JavaDoc:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

关于最大许可数量的一件事:信号量初始化时有一定数量的许可证可用,但这并不意味着这是它可以拥有的最大许可数量。从理论上讲,一个线程可以释放比它所获得的更多的许可(或者甚至在不先调用acquire的情况下释放许可)。因此,允许使用比信号量初始化更多的许可来调用aquire(int),并调用release(int)给予比信号量更多的许可。这种调用的语义取决于程序员...