我下面有三节课。 Main,两个线程和Obj,其方法已同步
public class DeadLocks {
public static void main(String[] args) {
SyncObj so = new SyncObj();
ThreadObj to = new ThreadObj(so);
ThreadObj1 to1 = new ThreadObj1(so);
to.start();
to1.start();
}
}
class SyncObj {
synchronized void foo() {
System.out.println("Foo Started");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bar();
}
synchronized void bar() {
System.out.println("bar started");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
foo();
}
}
class ThreadObj1 extends Thread {
SyncObj so;
public ThreadObj1(SyncObj so) {
this.so = so;
}
@Override
public void run() {
so.bar();
}
}
class ThreadObj extends Thread {
SyncObj so;
public ThreadObj(SyncObj so) {
this.so = so;
}
@Override
public void run() {
so.foo();
}
}
在上面的代码中,我在同一个对象上调用同步方法。两种方法同时执行和相互调用,没有死锁情况。谁能解释为什么?对不起这个愚蠢的问题。
最佳答案
据我所知,两种情况下您都使用相同的对象(so
)。因此,没有死锁的情况。您将需要锁定两个或多个对象,其中每个关键部分都需要除其持有的那个以外的其他锁。该另一个锁由“另一个”线程持有。
令人困惑的是,这将启发您:“https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html”
您将在您描述的场景中使用never ever deadlock
。在这种情况下,只有一个so
被共享并与之同步。
让我举一个例子来说明:
假设安迪和桑迪正在玩两个足球B1和B2。
现在进一步假设安迪和桑迪分别拥有球B1和B2。例如,安迪的球为B1,桑迪的球为B2。
现在,他们设计了一个游戏,其中每个人都需要两个球。
现在,桑迪也想要球B1,与此同时,安迪想要球B2。
而且他们两个都不能放弃他们所持的球。安迪不会放弃B1,反之亦然。
So both of them cannot continue and are stuck. We call this a deadlocked situation.
希望本示例对您有所帮助。您可以利用自己的想象力将比赛中的球数增加到3或4(依此类推..)和/或增加玩家数。
关于java - 为什么在此程序中的同一对象上没有死锁-Java Multithreading,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542187/