Java中的死锁:发生时

我正在为J2ME开发一个应用程序,有时它完全冻结,AMS需要相当长的时间来关闭它.在我看来,像一个死锁问题.

你能告诉我可能会导致死锁吗?例如,如果一个对象的同步方法调用一个自己的同步方法,会引起死锁吗?

谢谢!

更新

我正确地说,在下列情况下应该会发生僵局:

对象P调用对象A的同步方法,该方法调用对象B的同步方法,该方法调用对象A的同步方法

对不起,如果它看起来很愚蠢的我,很可能是.但是这就是为什么我问.谢谢!

解决方法

Would,for instance,calling a synchronized method of a object cause dead lock if it calls another synchronized method of its own?

不,因为Java中的同步锁可重入:您可以从同一个线程获取相同的锁多次而没有问题.

发生死锁,例如当线程A保持锁L并尝试获取锁M时,当线程B保持锁M并尝试获取锁L.因此,两个线程正在等待由另一个锁持有的锁,并且无法进行释放自己的锁.这会导致两个线程永远等待.情况也许涉及2线以上.

死锁可能非常难以检测,所以典型的方法是尽量避免仔细的设计.实现此目的的最简单方法是确保获取多个锁的任何线程始终以相同的预定义全局顺序获取它们.例如.如果在上述例子中,线程A和B都尝试首先获取锁L,则锁定M,将不会有死锁.

你的问题可能是由其他事情引起的,而不是死锁,例如一个活动锁(当一个线程,而不被阻止,仍然无法进展,因为它不断重试一个总是失败的操作).

更新:从对象外部访问锁

使用Java固有锁(即同步块),底层的Lock对象本身在代码中不可见,只有我们锁定的对象.考虑

class MyClass {
  private Object object = new Object();

  public synchronized void synchronizedOnThis1() {
    ...
  }
  public void synchronizedOnThis2() {
    synchronized(this) {
      ...
    }
  }
  public void synchronizedOnPrivateObject() {
    synchronized(object) {
      ...
    }
  }
}

class ExternalParty {
  public void messuplocks() {
    final MyClass myObject = new MyClass();
    synchronized(myObject) {
      Thread otherThread = new Thread() {
        public void run() {
            myObject.synchronizedOnThis1();
        }
      };
      otherThread.start();
      // do a lengthy calculation - this will block the other thread
    }
  }
}

synchronizedOnThis *方法在包含MyClass实例上同步;两种方法的同步是等效的.但是,类外显然是可以访问的,所以一个外部方可以把它当作一个外部的锁来使用,如上图所示.并且如果对象可以从另一个线程访问,并且该线程调用其synchronizedOnThis *方法之一,只要此线程在synchronized(myObject)块内,该调用将阻止.

OTOH方法synchronizedOnPrivateObject使用私有对象作为锁.如果该对象没有以任何方式发布给外部方,任何其他人都不会(无意或恶意)导致涉及此锁的死锁.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量