0

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

acquire(int parameter), acquireUninterptbly(int parameter), release(int parameter).

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

4

1 回答 1

2

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

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

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

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

例如,查看 JavaDoc:http ://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

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

于 2013-09-25T06:23:52.250 回答