【发布时间】:2019-12-17 19:59:08
【问题描述】:
我最近一直在学习 java 中的多线程概念。我有一些疑问没有通过在 StackOverflow 上查找相关线程来解决。我无法为以下问题找到满意的答案:
wait() 方法使线程等待直到获得锁。而 wait(long timeout) 方法使线程等待“超时”不。毫秒,如果它仍然没有获得锁,则返回可运行状态。但是要真正进入运行状态,它需要锁。那么等待(长时间超时)方法的意义何在?然而,当线程处于等待状态时,线程会释放它获得的锁。所以区别甚至不在于它获得的资源。如果线程处于等待状态或可运行状态有什么区别?与 wait() 方法相比,wait(long timeout) 有什么优势?
synchonized 关键字或块为调用方法或块的对象提供锁定。它会导致另一个试图获取同一实例上的锁的线程等待。但是在 ReentrantLock 的情况下,锁是在哪个对象上获取的?试图获取谁的锁的线程要等待?
ReentrantLock 如何避免死锁?假设有两种方法 m1 和 m2。两者都需要获取锁。 m1 正在调用 m2,而 m2 正在调用 m1。在这种情况下,我们如何使用 ReentrantLock 避免死锁?也许我们可以使用 tryLock() 并为无法获取锁的线程提供替代操作。但是可能的替代操作是什么?如果线程必须需要锁才能工作怎么办?
我发现使用 ReentrantLock 我们可以多次获取锁。但是为什么我们要多次获取锁呢?我已经阅读了这方面的理论答案,但无法真正理解。如果您可以使用清晰的示例代码进行演示,将会很有帮助。
【问题讨论】:
标签: java multithreading concurrency reentrantlock