在这些情况下会发生僵局吗?

时间:2012-04-11 22:57:05

标签: java concurrency deadlock

在这些Java情况下会发生死锁 1-

synchronized(obj) {
   obj.syncMethod(); // the method signature: public synchronized void syncMethod() {...}
}

2-

synchronized(obj) {
  if (condition) 
     throw new Exception(); // deadlock because obj lock is not released?
  // do other stuff
}

谢谢。

3 个答案:

答案 0 :(得分:2)

  1. 不会发生死锁。您已经锁定 obj

  2. 如果抛出异常,则释放锁定。请参阅此处的问题:

  3. Side effects of throwing an exception inside a synchronized clause?

答案 1 :(得分:1)

  1. 不会发生死锁 - Java的锁是可重入的,也就是说,当一个线程持有一个锁(在你的情况下是obj)时,它可以输入需要相同锁的同步块而没有问题(a synchronized方法在 this 上同步,在你的情况下也是obj。
  2. 当同步块离开时,锁定将被释放,无论异常是否导致线程离开。

答案 2 :(得分:0)

如果您没有在synchronized块中捕获异常,那么您的锁将被释放并且不会发生死锁。有关详细信息,请参阅here