有谁知道这些方法之间的区别acquire ()
and release ()
(java.util.concurrent.Semaphore
) and await ()
and signal (new ReentrantLock().newCondition() )
.
您能为每个方法公开一个伪代码吗?
从表面上看,这些方法的行为可能看起来很相似 -acquire()/await()
在某些情况下可能会使线程阻塞release()/signal()
在某些情况下可以解锁线程。然而信号量和条件有不同的用途:
-
java.util.concurrent.Semaphore
是比较高级的同步机制,供一般开发人员使用。您通常会使用它通过使每个请求者线程调用来限制对某些资源的并发访问acquire()
在访问资源之前(如果没有可用的信号量许可,则使线程阻塞)。
javadoc 的描述:
从概念上讲,信号量维护一组许可证。如果有必要,每个 acquire() 都会阻塞,直到获得许可,然后获取许可。每个release()都会添加一个许可,可能会释放一个阻塞的获取者。
java.util.concurrent.locks.Condition
是相对较低级别的同步机制,它基本上增强了提供的功能java.lang.Object
方法wait()
, notify()
and notifyAll()
。当线程需要等待某些条件变为真时(通常通过其他线程的活动),它使线程能够挂起其活动,然后当状态变量取值时,它使其他线程能够“唤醒”等待线程。部分情况可能已经改变。通常很难正确使用,建议一般开发人员使用 java.util.concurrent 包中的更高级别的机制(如 Semaphore)。
您可以在 Brian Goetz 的优秀著作《Java Concurrency in Practice》中找到更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)