信号量与条件(ReentrantLock)之间的区别
有谁知道方法acquire ()
和release ()
( java.util.concurrent.Semaphore
)和await ()
和signal (new ReentrantLock().newCondition() )
之间的区别。
你能为这些方法公开一个伪代码吗?
从表面上看,这些方法的行为可能看起来类似 – acquire()/await()
可以使线程在某些情况下阻塞,而release()/signal()
可以在某些情况下解除阻塞。 但是,信号量和条件有不同的用途:
-
java.util.concurrent.Semaphore
是相对较高级别的同步机制,供一般开发人员使用。 您通常会使用它来限制对某些资源的并发访问,方法是在访问资源之前让每个请求者线程调用acquire()
(如果没有可用的信号量许可,那么就会产生线程阻塞)。 来自javadoc的描述:从概念上讲,信号量保持一组许可。 如果需要,每个acquire()都会阻止,直到有许可证可用,然后接受它。 每个版本()都会添加许可证,可能会释放阻塞收单器。
-
java.util.concurrent.locks.Condition
是相对低级的同步机制,它基本上增强了java.lang.Object
方法提供的functionwait()
,notify()
和notifyAll()
。 它允许线程在需要等待某些条件变为真时(通常通过其他线程的活动)暂停其活动,然后它使那些其他线程在状态变量采取时“唤醒”等待的线程条件中的部分可能已经改变。 它通常更难正确使用,建议一般开发人员使用java.util.concurrent包中的更高级别的机制(如Semaphore)。
您可以在Brian Goetz的优秀书籍“Java Concurrency in Practice”中找到有关此内容的更多详细信息。
- StringBuilder与.concat对比“+”运算符相对性能在eclipse中与命令行不同?
- 使用已知但无法访问的wsdl创建Web服务客户端
- Java字符串数组差异
- 独立Jython:导入错误(Apache-POI)
- 如何在Wildfly 8上的Picketbox / Undertow中捕获FailedLoginException以应用CORS
- Maven错误:(重复)java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空
- 使用Maven在Tomcat中动态运行WAR,如何添加类路径条目以便只有Tomcat才能看到它们?
- 在Java中查找二次回归曲线的最佳方法
- 从文本中提取名词(Java)