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

标签 java multithreading semaphore

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

获取(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/

相关文章:

c - 有没有办法用 2 个信号量来解决生产者-消费者问题?

java - 从数据库检索数据的想法 struts 2 web 应用程序

java - 返回私有(private)静态变量

java - 来自 Scanner 通过 PrintWriter 的字符串数据

java - 一个应用程序代码具有多个上下文路径/部署以连接到不同的数据库

c# - .NET 3.5 C# 没有提供我锁定所需的内容 : Count async saves until 0 again

java - 暂停执行 Runnable 和/或将其移动到另一个线程

objective-c - iOS - 在不卡住 UI 的情况下处理数据

java - ScheduledExecutorService 生命周期?

c# - 需要了解SemaphoreSlim的用法