信号量如何以及为什么能够提供比初始化时更多的许可证?

Vin*_*C M 10 java concurrency multithreading semaphore

我正在阅读Java Concurrency in Practice一书.在一节java.util.concurrent.Semaphore中,书中有以下几行.它是关于其"虚拟许可"对象的实现的评论

该实现没有实际的许可对象,Semaphore也没有将分配的许可与线程相关联,因此在一个线程中获得的许可可以从另一个线程中释放.您可以将其 acquire视为消费许可和release创建许可; a Semaphore不限于创建它的许可数量.

有人可以解释一下吗?我无法理解这一点.如果我们创建一个固定大小的池,我们会创建固定数量的"许可".从上面的陈述看,"许可证"似乎可以继续增长.为什么这样设计?

Thi*_*ilo 9

实现只是有一个计数器,而不是"分发"许可对象.当"创建"新许可证时,计数器增加,当许可证"返回"时,计数器减少.

这比始终创建实际对象的性能要好得多.

权衡是信号量本身无法检测某些类型的编程错误(例如未经授权的许可证现金或信号量泄漏).作为编码员,你必须确保自己遵守规则.


Pet*_*rey 6

有人可以解释一下吗?从上面的陈述看,"许可证"似乎可以继续增长.

信号量是许可证的计数器.获得就像是等待而不是低于零的减量.它没有上限.

为什么这样设计?

因为它很简单.


小智 5

我认为这意味着我们可能需要 Semaphore 的时间作为我们发布“额外”的时间以及它创建的许可。

如:

Semaphore s = new Semaphore(1); // one permit when initialize

s.acquire();
s.release();

s.release(); // "extra" release.
Run Code Online (Sandbox Code Playgroud)

此时,该信号量允许一个原始许可和一个“额外”许可