我对信号量计数器和信号量方法的形式参数感到困惑,例如
获取(int 参数)
、acquireUninterptbly(int 参数)
、release(int 参数)
。
如果参数大于信号量计数器会发生什么,反之亦然。
如果有人通过实时示例进行解释,将会非常有帮助。
最佳答案
信号量
具有一定数量的可用许可。如果调用acquire(int Permits),则从信号量中获取给定数量的许可。如果信号量没有足够的许可,该方法将阻塞/挂起调用线程,直到有足够的许 cocoa 用。
如果在信号量上调用release(int Permits)
,则给定数量的许可将返回给信号量。如果线程正在等待许可(由于阻塞 acquire
调用),它们会被唤醒并尝试获取其请求的许可数量。
(在内部,许可只不过是一个线程安全的数字计数器,可以减少或增加,并且永远不能为负)。
通常,aquire(int)
是可中断的,因此在 aquire(int)
中等待的线程 t
可以被中断:从另一个线程调用t.interrupt()
。在这种情况下,阻塞的 aquire
调用会被 InterruptedException
终止。如果使用 aquireUninterruptically
方法而不是 acquire
,则此方法不起作用。
例如,请查看 JavaDoc:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
关于最大许可数的一件事:信号量是用一定数量的可用许可来初始化的,但这并不意味着这是它可以拥有的最大许可数。理论上,线程可以释放比其获取的更多的许可(或者甚至在不首先调用 acquire
的情况下释放许可)。因此,允许调用 aquire(int)
时获得比信号量初始化时更多的许可,并调用 release(int)
时返回比信号量曾经拥有的更多许可。此类调用的语义取决于程序员......
关于java - 信号量计数器和信号量方法整数参数之间的理解差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18997335/