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

信号量和条件(ReentrantLock)之间的区别

孙阳旭
2023-03-14
问题内容

有谁知道方法acquire ()release ()java.util.concurrent.Semaphore)和await ()和之间的差异signal (new ReentrantLock().newCondition() )

您可以为每种方法公开伪代码吗?


问题答案:

从表面上看,这些方法的行为可能看起来很相似- 在某些情况下acquire()/await()
可能使线程阻塞,release()/signal()在某些情况下可能会导致线程阻塞。但是,信号量和条件有不同的用途:

  • java.util.concurrent.Semaphore是相对较高级别的同步机制,供一般开发人员使用。您通常会使用它来限制对某些资源的并发访问acquire(),方法是在访问资源之前先进行每个请求者线程调用(如果没有信号灯许可,则使线程阻塞)。来自Javadoc的说明:

从概念上讲,信号量维护一组许可证。如有必要,每个Acquisition()会阻塞,直到获得许可为止,然后再获取许可。每个release()添加一个许可,有可能释放阻塞获取者。

  • java.util.concurrent.locks.Condition是相对较低级别的同步机制,基本上可以增强提供的java.lang.Object方法的功能wait()notify()并且notifyAll()。它使线程在需要等待某种条件变为真时挂起其活动(通常通过其他线程的活动),然后使其他线程能够在状态变量占用时“唤醒”正在等待的线程。条件中的一部分可能已更改。通常很难正确使用,建议一般开发人员使用java.util.concurrent包中的高级机制(例如Semaphore)。

您可以在Brian Goetz的出色著作“ Java Concurrency in Practice”中找到有关此问题的更多详细信息。



 类似资料:
  • 问题内容: 在Linux内核中,信号量用于为数据的关键部分提供互斥,而Completion变量用于在等待事件的2个线程之间进行同步。为什么不使用信号量进行这种同步呢?使用完成变量比使用信号量有什么优势吗? 问题答案: 您可能要使用补全而不是信号量有两个原因。首先,多个线程可以等待完成,并且可以通过调用来全部释放它们。使信号量唤醒未知数量的线程更为复杂。 其次,如果等待线程要取消分配同步对象,则在使

  • 问题内容: 我一直在尝试了解可重入锁和信号量(可重入锁的嵌套与释放/解锁机制)。 似乎拥有信号量需要您编写一个经过更彻底测试的应用程序,因为release()方法不会检查释放许可的线程是否实际上持有它。测试我的测试代码时,我发现这可能会随后使许可数量超出初始限制。另一方面,如果线程在调用unlock方法时未持有可重入锁,则将收到IllegalMonitorException。 因此,可以说没有真正

  • 本文向大家介绍操作系统中的信号量和监视器之间的区别,包括了操作系统中的信号量和监视器之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解操作系统中的信号量和监视器之间的区别- 信号 它是一个整数变量。 此整数变量的值表明系统中可用的共享资源的数量。 当任何进程有权访问共享资源时,它将对信号量执行“等待”操作(使用wait方法)。 当进程释放共享资源时,它将对信号量执行“信号”操

  • 问题内容: 在两个不同的表之间使用逗号或联接有什么区别? 例如以下两个代码: 问题答案: 执行它们时并没有真正的区别,但是在工作中存在可读性,一致性和减轻错误的问题: 想象一下,如果您有4张桌子,如果使用老式的INNER JOIN方法,那么最终结果将是: 使用显式的INNER JOINS它将是: 后者显示了您在桌子前面的确切位置。它具有更高的可读性,并且更容易出错,因为与在WHERE中添加另一个A

  • 问题内容: 我一直以为并且是完全相同的,因此可以互换使用。今天,当我尝试在共享服务器上安装与memcached的python绑定 pylibmc时 ,使用的错误给了我,但没有给我 。我想说明原因。 libmemcached 是 pylibmc 的要求。我在主目录下安装了 libmemcached, 因为服务器上没有root。结果,要安装 pylibmc ,我需要确保安装脚本知道在哪里可以找到 li

  • 问题内容: 抱歉,我的问题是否愚蠢,没关系。但是我只想知道在这两种情况下会发生什么。 两者都只给出相同的结果。但是我知道有一些原因。我不知道这一点。这两个条件有什么区别? 问题答案: 它们之间没有任何区别。许多程序员使用第二种方法只是为了确保他们没有得到。就这样。