我对Semaphore计数器和信号量方法的形式参数感到困惑,比如
acquire(int parameter)
,acquireUninterptbly(int parameter)
,release(int parameter)
。
如果参数大于信号量计数器,反之亦然,会发生什么 如果有人通过实时示例解释,那将非常有帮助。
答案 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)
给予比信号量更多的许可。这种调用的语义取决于程序员...