当前位置: 首页 > 面试题库 >

二进制信号量与ReentrantLock

荆煌
2023-03-14
问题内容

我一直在尝试了解可重入锁和信号量(可重入锁的嵌套与释放/解锁机制)。

似乎拥有信号量需要您编写一个经过更彻底测试的应用程序,因为release()方法不会检查释放许可的线程是否实际上持有它。测试我的测试代码时,我发现这可能会随后使许可数量超出初始限制。另一方面,如果线程在调用unlock方法时未持有可重入锁,则将收到IllegalMonitorException。

因此,可以说没有真正的理由拥有二进制信号量,因为二进制信号量可以做的所有事情也可以由ReentrantLock完成。如果我们使用二进制信号量,我们将必须检查整个方法调用堆栈,以查看之前是否已获得许可(如果还有后续获取的可能性,许可是否也会被释放-
如果释放未进行,则许可可能会阻塞,并且等等)。另外,由于可重入锁还为每个对象提供一个锁,所以优先选择可重入锁而不是二进制信号量总是更好的主意吗?

我在这里检查了一篇文章,该文章讨论了二进制信号量和互斥锁之间的区别,但是在Java中是否有像互斥锁这样的东西?

谢谢陈

PS-我已经在另一个论坛(http://www.coderanch.com/t/615796/threads/java/reason-prefer-
binary-Semaphore-
Reentrant
)上发布了此问题,但尚未收到任何回复。我以为我也会在这里张贴它,看看我能得到什么。


问题答案:

没有真正的理由拥有二进制信号量,因为二进制信号量可以做的所有事情也可以由ReentrantLock完成

如果您所需要的只是可重入互斥,那么是的,没有理由在ReentrantLock上使用二进制信号量。如果出于任何原因需要非所有权释放语义,那么显然信号灯是您唯一的选择。

另外,由于可重入锁还为每个html" target="_blank">对象提供一个锁,所以优先选择可重入锁而不是二进制信号量总是更好的主意吗?

这取决于需要。如前所述,如果您需要一个简单的互斥量,则不要选择信号量。如果一个以上的线程(但数量有限)可以进入关键部分,则可以通过线程限制或信号量来执行此操作。

我在这里检查了一篇文章,该文章讨论了二进制信号量和互斥锁之间的区别,但是在Java中是否有像互斥锁这样的东西?

ReentrantLocksynchronized在Java互斥的例子。



 类似资料:
  • 在计算信号量时,没有提供相互排斥,因为有一组同时需要在临界区执行的进程。 然而,二进制信号严格提供互斥。 在这里,临界区域不能有超过1个槽位,而临界区域最多只能有1个槽位。 信号量只能有两个值,0或1。 下面,我们来看看二进制信号量的编程实现。

  • 我有多个进程与Sempahore同步。我知道这段代码不允许gurantee出现这样的情况:在sem_getvalue期间,即使值变为零,甚至在调用特定进程中的sem_post之前,anotehr进程也可能调用sem_post,使值变为2。如何解决这种情况。 我的问题不能通过互斥体来解决,在我的问题中,有些进程只用于信号,即操作,而在互斥体中,所有进程都将等待并不断地发出信号

  • 我有: 产生项目的许多线程 要点: 生成项目比更新GUI快得多 我们可能有很多新项目同时生产 每个项目生产后都必须进行一次GUI更新 如果产品同时发生,所有产品必须只进行一次更新...没有必要多次刷新GUI 我想我正在寻找一些实现二进制信号量的标准结构,其中最大许可数是1,这样工作人员就可以调用多个,而不会相互阻塞,如果调用了一个,那么: 如果GUI线程正在睡眠= 代码应如下所示: 请注意,使用1

  • 问题内容: 在手册页中,即使您将信号量初始化为一个值,也可能会出现: 多次调用时,它仍可以增加到大于1的值。 但是在此代码示例中,注释似乎有所不同: 是否可以在C中初始化严格的二进制信号量? 注意:在这种情况下,这样做而不使用互斥的原因是sem_post和sem_wait可能由不同的线程调用。 问题答案: 如果要在Linux上使用严格的二进制信号量,建议使用互斥量和条件变量构建一个。

  •  提示: 任务通知在某些情况下可以提供一个轻量的选择用以替代二值信号量,详见:任务通知  二值信号量(Binary Semaphores)通常用来实现互斥、同步。二值信号量与互斥量虽然相似,但是互斥量拥有优先级继承的特性,而二值信号量没有。这使得二值信号量更加合适去实现同步,互斥量更加适合去实现互斥。 信号量可以设置阻塞时间,当任务试图获取一个暂时不可用的信号量的适时候,会进入阻塞态,直到阻塞时间