我在一本Java教材中读到了以下关于多线程的内容:
如果一个线程要调用wait()或notify(),则该线程必须是该对象锁的所有者。当线程等待时,它会暂时释放锁以供其他线程使用,但在继续执行时需要重新获取锁。
我对下面这个从句感到困惑:
当线程等待时,它会暂时释放锁以供其他线程使用
我不明白这句话在说什么。它是在说当调用wait()方法时,在wait()返回之前实际上会释放锁吗(即调用者并不知道这个过程)?还是只是在提到wait(timeout)时当超时时间结束后释放锁?如果是前者,为什么会在notify()之前释放锁呢?这似乎是一个含糊且解释不足的陈述。
如果一个线程要调用wait()或notify(),则该线程必须是该对象锁的所有者。当线程等待时,它会暂时释放锁以供其他线程使用,但在继续执行时需要重新获取锁。
我对下面这个从句感到困惑:
当线程等待时,它会暂时释放锁以供其他线程使用
我不明白这句话在说什么。它是在说当调用wait()方法时,在wait()返回之前实际上会释放锁吗(即调用者并不知道这个过程)?还是只是在提到wait(timeout)时当超时时间结束后释放锁?如果是前者,为什么会在notify()之前释放锁呢?这似乎是一个含糊且解释不足的陈述。
wait()
(或其超时重载)必须释放锁,否则另一个线程如何获取锁以调用notify()
/notifyAll()
?注意,线程通过使用synchronized(someObj){...}
来获取对象的锁。 - Slaw