【问题标题】:will deadlock occur in these situations?在这些情况下会发生死锁吗?
【发布时间】:2012-04-24 07:14:23
【问题描述】:

在这些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
}

谢谢。

【问题讨论】:

  • 我没有使用同步方法的经验,但是仅仅因为抛出异常而导致方法的执行异常终止就可能发生死锁似乎很愚蠢。而且,如果是这种情况,您可以在那里捕获任何异常,解锁对象并抛出一个新异常。
  • 你为什么不测试你的代码并找出答案?

标签: java concurrency deadlock


【解决方案1】:
  1. 不应发生死锁。你已经持有 obj 的锁了。

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

Side effects of throwing an exception inside a synchronized clause?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      1. 不会发生死锁 - Java 的锁是可重入,也就是说,当线程持有锁时(在您的情况下,在 obj 上)它可以毫无问题地进入需要相同锁的同步块(a synchronized 方法在 this 上同步,在您的情况下也是 obj)。
      2. 离开同步块时,无论异常是否导致线程离开,锁都会被释放。

      【讨论】:

      • 这就是为什么在使用 j.u.c.Locks 时,最佳实践是在 try/finally 块中执行锁定/解锁 - 以确保始终执行解锁。内在同步(又名同步)默认提供此功能 - 但有其他限制
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2012-11-05
      • 2022-12-18
      • 1970-01-01
      • 2022-01-14
      • 2015-04-14
      相关资源
      最近更新 更多