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