java - 锁和嵌套的同步方法

标签 java methods nested synchronized locks

假设我们有这样的东西,

class Class{    
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}

我的问题 - 什么时候释放对象 obj 的锁?当它从方法 m2 或方法 m1 返回时?

最佳答案

来自JLS Section 17

A thread t may lock a particular monitor multiple times; each unlock reverses the effect of one lock operation.

但是,由于 m1()m2() 可能锁定不同 对象,您的问题变得复杂了。 m1() 锁定您调用它的任何对象,您尚未显示。所以事件的顺序是:

  1. 您调用 x.m1(y),其中 xy 可能是 Class 的不同实例。
  2. 在进入 m1 之前,JVM 锁定 x 的监视器。
  3. m1 调用 m2
  4. 在进入 m2 之前,JVM 会为 y 锁定监视器。
  5. m2 退出时,释放 y 的监视器
  6. m1 退出时,释放 x 的监视器

如果xy 是同一个对象,那么在m1 退出时释放锁。

关于java - 锁和嵌套的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10825124/

相关文章:

java - 数组作为实例变量

excel - 使用日期在 Excel 中嵌套 IF 语句

java - 使用 ElasticSearch-Hadoop 构建项目时构建失败

尝试使用 RabbitMQ 和 Spring 发送消息时出现 java.util.NoSuchElementException

java - 有没有一种方法可以获取边所属方式的 ID?

Java-使用方法

c++ - 具有友好方法名称的 c 静态方法调用

javascript - Imacros - 使用 Javascript 循环多个宏特定次数

c - 我的嵌套结构声明有问题吗?

java - 提取字符串的特定部分