当前位置: 首页 > 知识库问答 >
问题:

信号量在Java中的实现

仲孙华奥
2023-03-14

我没有使用足够奇怪的信号灯
无论如何,我在查看一些使用它的代码时发现,与锁不同,许可证可以由另一个线程发布(即没有所有权)
我研究了并发操作,它说(第98页):

实现没有实际的许可对象。。。。因此,一个线程获得的许可证可以由另一个线程发布

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

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

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

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

共有1个答案

宗政海
2023-03-14

根据Wikipedia的说法,信号量不跟踪获取/发布的对象,只跟踪数字。因此,“所有权”在此不适用。阅读“重要观察”一节!

因此,没有所有权。在这方面,Java信号量做了正确的事情。Unix信号量(参见semop(2))也是这样工作的。

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

编辑:

我不敢相信Tannenbaum没有区分信号量和互斥量,所以我搜索了“当一个进程修改信号量值[…]”的完整引文并且想出了这样的东西(不知道他们是否来自Tannenbaum):

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

其他引文如此相似,我怀疑是抄袭

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

 类似资料:
  • 本文向大家介绍Java 信号量Semaphore的实现,包括了Java 信号量Semaphore的实现的使用技巧和注意事项,需要的朋友参考一下 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。 此解视Semaphore为锁,以保证同一时刻单线程的顺序执行。在此原题上,我作出如下更改。 10个线程的常量池中,分别调用R1,R2,R3的方法多次

  • 我试图理解这个旧考试任务的答案,在这个任务中,学生应该使用JavasReentrantLock实现一个公平的二进制信号量。我不明白这些计数器的意义: 它在任务的描述中说,“你可以假设程序中使用信号量最多有20个线程。此外,最多1000万信号量操作将在程序的一次运行中执行。"在任务的解决方案中,它说:“每个试图获取信号量的线程必须在队列中注册自己,并且只有在之前的线程离开队列后才离开队列。每个线程使

  • 首先想到的问题是,为什么我们需要信号量? 一个简单的答案,以保护多个进程共享的关键/共同区域。 假设多个进程正在使用相同的代码区域,如果所有人都想并行访问,那么结果是重叠的。 例如,多个用户仅使用一台打印机(通用/关键部分),例如个用户,同时给予个作业,如果所有作业并行启动,则一个用户输出与另一个用户输出重叠。 因此,我们需要使用信号量来保护这个信号,即当一个进程正在运行时锁定关键部分,并在完成时

  • 信号量 信号量是一种同步互斥机制的实现,普遍存在于现在的各种操作系统内核里。相对于spinlock 的应用对象,信号量的应用对象是在临界区中运行的时间较长的进程。等待信号量的进程需要睡眠来减少占用 CPU 的开销。参考教科书“Operating Systems Internals and Design Principles”第五章“同步互斥”中对信号量实现的原理性描述: struct semaph

  • 一个线程发送信号量,另外一个线程接收信号量 一个线程发送信号量,另外一个线程接收信号量 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie

  • 信号量接口 结构体 struct   rt_semaphore   信号量控制块 更多...   类型定义 typedef struct rt_semaphore *  rt_sem_t   信号量类型指针定义   函数 rt_err_t  rt_sem_init (rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_t flag