gpt4 book ai didi

java - Java 中的死锁 : When they occur?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:53:08 27 4
gpt4 key购买 nike

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

你能告诉我什么会导致死锁吗?例如,如果对象调用其自身的另一个同步方法,调用对象的同步方法是否会导致死锁?

谢谢!


更新

我说死锁应该发生在以下情况中是否正确:

对象P调用对象A的同步方法,A调用对象B的同步方法,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 内在锁(即 synchronized block ),底层 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 使用私有(private)对象作为锁。如果该对象未以任何方式发布给外部各方,则其他任何人都不能(无意或恶意)导致涉及此锁的死锁。

关于java - Java 中的死锁 : When they occur?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3598822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com