在这种情况下,线程如何同时获取两个对象的锁?

xpl*_*raj 3 java multithreading synchronization thread-synchronization

public void method(Type1 inst1, Type2 inst2) {
  synchronized(inst1) {
    synchronized(inst2) {
      //do something now
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

从这段代码中我可以理解,一旦一个线程进入该方法,它会在inst1上获取锁,然后在inst2上获取锁,不会释放inst1锁。我假设这两个对象都没有被其他线程锁定。

  1. 如果一个线程一次只能获取一个对象的锁,并且当当前对象的锁被释放时只能拥有另一个锁,那么这段代码如何有效,或者更确切地说,它是我认为我见过的有效代码某处?
  2. 如果 Type1 和 Type2 相同呢?
  3. 如果我们使方法同步,考虑到它驻留在方法的参数类型以外的类中,会发生什么?

mor*_*ano 5

1 . 如果一个线程一次只能获取一个对象的锁,并且当当前对象的锁被释放时只能拥有另一个锁,那么这段代码如何有效,或者更确切地说,它是我认为我见过的有效代码某处?

这是一个有效的代码,锁不在方法所在的对象上,而是在inst1和 上inst2。此外,锁不在类上,而是针对每个对象

2 . 如果 Type1 和 Type2 相同呢?

同样,锁是在对象上,而不是在类上。如果 inst1 和 inst2 相同,则该线程只有一个锁,同一个线程“重新进入”该锁是有效的

3 . 如果我们使方法同步,考虑到它驻留在方法的参数类型之外的类中,会发生什么?

然后你还有另一个锁,这次是在执行方法的对象(不是类)上。