2

我还没有使用Semaphore足够奇怪的......
无论如何我正在审查一些使用它的代码,并看到与锁不同,许可证可以由另一个线程释放(即没有所有权)。
我看了看Concurrency in Action,上面写着(第 98 页):

该实现没有实际的许可对象......所以一个线程获得的许可可以被另一个线程释放

我之前没有注意到这个细节,并查看了我所说的操作系统教科书(我的重点):

当一个进程修改信号量值时,没有其他进程 ....etc

那么这是 Java 特定的设计决策吗?我的意思是信号量不属于线程。
还是我误解了信号量的概念?

注意:这不是一个好/坏设计等问题。我只是想确保我理解这个概念

4

1 回答 1

2

根据维基百科,信号量不会跟踪获取/释放对象,而只会跟踪数量。因此,“所有权”在这里不适用。阅读“重要观察”部分!

因此没有所有权。在这方面,Java 信号量是正确的。Unix 信号量(参见 semop(2))也以这种方式工作。

然而,一些教科书似乎相当自由地混合了术语“互斥锁”、“锁”和“信号量”——你可以自己判断这些文本的质量。

编辑:

我简直不敢相信 Tannenbaum 在信号量和互斥量之间没有区别,所以我搜索了“当一个进程修改信号量值 [...]”的完整引用并想出了这个问题(不知道是否他们来自坦南鲍姆):

[...] P 和 V 操作中对 S 的修改是不可分割地执行的:也就是说,当一个进程修改信号量值时,没有其他进程可以同时修改相同的信号量值。[...]

其他报价非常相似,我怀疑复制和粘贴:-)

关键是:如果您的文本内容相同,那么您误解了该段落的意图-这与“所有权”无关,而“仅”与并发访问有关。当多个线程试图同时访问一个信号量时,线程必须被序列化并且值的修改(记住——所有资源的信号量内只有一个值)必须是原子的。

于 2013-02-10T11:38:02.313 回答