等待方法是否立即释放锁的控制权?

3

我正在阅读Java文档,它关于notify方法的说明是,它不会立即放弃控制权。也就是说,如果在调用notify方法后,在同步的代码块中还有一些代码要执行,那么它将先完成剩余的代码,然后再放弃控制权。

synchronized(this) {
// line 1
notify();
//line 2
// line 3
}

第二行和第三行代码仍然会被执行。wait方法是否具有相同的功能呢?

synchronized(this) {
// line 1
wait();
//line 2
// line 3
}

第二行和第三行会被执行吗?
2个回答

1
这是您刚刚读到的内容。在调用notify的线程的同步块完成之前,wait调用后的第2和第3行将仅运行一次:
唤醒的线程在当前线程放弃此对象上的锁定之前无法继续执行。唤醒的线程将以通常的方式与可能正在积极竞争以在此对象上同步的任何其他线程竞争。
(摘自http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()
当然,这是因为两个线程都在相同的(this)对象上同步。

1

根据wait()的文档:

  1. 当前线程必须拥有此对象的监视器。
  2. 线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知在此对象的监视器上等待的线程唤醒。
  3. 然后,线程等待重新获得监视器的所有权并
  4. 恢复执行。

因此,点1对应于synchronized()语句;点2、3和4位于wait()方法中,点5对应于您代码中的第2和第3行。


你的意思是它会立即释放锁,当它重新获取锁时,第2行和第3行将被执行。 - JManish
第二行释放了锁(在JVM中称为监视器)。第2和第3行本质上是原子操作;这样做是为了确保没有通知丢失。 - Tassos Bassoukos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接