wait方法是否立即放弃对Lock的控制

时间:2015-12-26 10:01:01

标签: java multithreading

我正在阅读Java文档,它说通知方法它不会立即放弃控件。也就是说,如果在调用notify方法后同步代码块中仍然存在一些代码,那么它将首先完成剩余的代码,然后放弃该控件。

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

第2行和第3行仍将执行。

等待方法的功能是否相同
synchronized(this) {
// line 1
wait();
//line 2
// line 3
}

第2行和第3行会被执行吗?

2 个答案:

答案 0 :(得分:1)

这是你刚读过的内容。 wait调用后的第2行和第3行只会在调用notify的线程的同步块完成后运行:

  

在当前线程放弃对此对象的锁定之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与可能主动竞争同步此对象的任何其他线程竞争

(这是来自http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()

当然这是因为两个线程在同一个(this)对象上同步。

答案 1 :(得分:1)

没有。来自wait()的文档:

  1. 当前主题必须拥有此对象的监视器。
  2. 线程释放此监视器的所有权和
  3. 等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。
  4. 线程然后等待,直到它可以重新获得监视器的所有权和
  5. 恢复执行。
  6. 因此,第1点对应synchronized()语句;点2 3和4在wait()方法中,点5对应于代码中的第2行和第3行。