gpt4 book ai didi

java - Java 中的信号量实现

转载 作者:行者123 更新时间:2023-11-30 09:26:55 25 4
gpt4 key购买 nike

我还没用过Semaphore就够奇怪了...
不管怎样,我正在审查一些使用它的代码,发现与锁不同,许 cocoa 以由另一个线程释放(即没有所有权)。
我查看了 Concurrency in Action,它说(第 98 页):

The implementation has no actual permit objects....so a permit acquired by one thread can be released by another

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

When one process modifies the semaphore value no other process ....etc

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

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

最佳答案

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

因此没有所有权。在这方面,Java 信号量做对了。 Unix 信号量(请参阅 semop(2))也是以这种方式工作的。

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

编辑:

我不敢相信 Tannenbaum 没有区分信号量和互斥量,所以我搜索了“当一个进程修改信号量值时[...]”的完整引用并提出了这个谎言(不知道无论他们是否来自 Tannenbaum):

[...]the modifications to S in the P and V operations are executed indivisibly: that is when one process modifies the semaphore value, no other process can simultaneously modify that same semaphore value.[...]

其他引述如此相似以至于我怀疑复制粘贴 :-)

关键是:如果您的文本读起来一样,那么您误解了该段落的意图 - 它不是关于“所有权”,而是“仅”关于并发访问。当多个线程同时尝试访问一个信号量时,必须对线程进行序列化并修改 值(记住 - 信号量内只有 一个 值 < em>所有 资源)必须是原子的。

关于java - Java 中的信号量实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com