首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待方法是否立即放弃了Lock的控制权?

等待方法是否立即放弃了Lock的控制权?
EN

Stack Overflow用户
提问于 2015-12-26 10:01:01
回答 2查看 965关注 0票数 3

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

代码语言:javascript
运行
复制
synchronized(this) {
// line 1
notify();
//line 2
// line 3
}

第2行和第3行仍将被执行。相同的功能是否适用于等待方法,即

代码语言:javascript
运行
复制
synchronized(this) {
// line 1
wait();
//line 2
// line 3
}

将执行第2行和第3行吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-26 10:09:47

不是的。来自wait()的文档

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-12-26 10:08:25

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34470265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档