我正在经历Java线程,特别是死锁概念,我在下面的代码中找到了这个:
public static void main(String... a) {
final String o1 = "Lock ";
final String o2 = "Step ";
Thread th1 = new Thread() {
public void run() {
while (true) {
synchronized (o1) {
synchronized (o2) {
System.out.println(o1 + o2);
}
}
}
}
};
Thread th2 = new Thread() {
public void run() {
while (true) {
synchronized (o2) {
synchronized (o1) {
System.out.println(o2 + o1);
}
}
}
}
};
new Thread(th1).start();
new Thread(th2).start();
}
请根据我的理解解释程序正在做什么,一个线程已经锁定并试图获取另一个锁定,而其他线程完成同样的操作,最后当我们启动时,两个线程都被卡住,有没有其他方法来创建上述程序的死锁,请提供建议以及上述代码中的锁定是实例级锁定。
答案 0 :(得分:2)
考虑以下情况:
th1
锁定o1
并在有机会锁定o2
之前被中断; th2
锁定o2
并尝试锁定o1
。两个帖子都没有进一步的进展,你有一个deadlock。
您的代码的原始版本(在编辑之前)不可能出现死锁,因为两个线程以相同的顺序获取了两个锁(o1
然后o2
)。
答案 1 :(得分:0)
要创建死锁,您需要创建一个多线程正在等待其他线程持有的锁的情况。例如:
按顺序请求:Lock2,Lock1
在你的(未经编辑的第一个)示例中,两个线程以相同的顺序请求所需的锁,这非常重要。如果Thread1获得Lock1,则Thread2无法获取Lock2并创建死锁,因为它仍在等待Lock1。避免死锁,因为两个线程都试图以相同的顺序获取锁。
在您的(新的,编辑过的)示例中,死锁可能如上所述发生。
答案 2 :(得分:0)
根据您编辑的帖子,th1可以获得o1而th2可以获得o2。然后两个线程都在等待另一个线程释放他们尚未获得的锁定,并且它永远不会发生==>死锁。