kTi*_*ari 2 java multithreading
我只是编译并运行java程序,但输出很不愉快.我不知道为什么线程处于死锁状态.任何人都可以帮助我理解程序的输出.
class A {
synchronized void foo(B b) {
String name=Thread.currentThread().getName();
System.out.println(name+"entered A.foo");
try {
Thread.sleep(1000);
} catch(Exception e) {}
System.out.println(name+"trying to call B.last()");
b.last();
}
synchronized void last() {
System.out.println("inside A.last");
}
}
class B {
synchronized void bar(A a) {
String name=Thread.currentThread().getName();
System.out.println(name+"entered B.bar");
try {
Thread.sleep(1000);
} catch(Exception e) {
System.out.println("b interrupted");
}
System.out.println(name+"trying to call A.last()");
a.last();
}
synchronized void last() {
System.out.println("inside A.last");
}
}
class DeadLock implements Runnable {
A a=new A();
B b=new B();
DeadLock() {
Thread.currentThread().setName("mainthread");
Thread t=new Thread(this,"racingthread");
t.start();
a.foo(b);
System.out.println("back in main thread");
}
public void run() {
b.bar(a);
System.out.println("back in other theread");
}
public static void main(String...d) {
new DeadLock();
}
}
Run Code Online (Sandbox Code Playgroud)
我的电脑上的输出是
mainthreadentered A.foo
racingthreadentered B.bar
mainthreadtrying to call B.last()
racingthreadtrying to call A.last()
Run Code Online (Sandbox Code Playgroud)
你有一个经典的僵局.
A.foo()试图锁定的锁a和调用b.last()bB.bar()试图锁定的锁b1和调用a.last()a两者都不能继续,因为每个人都需要另一个人的锁定.
我不知道为什么线程处于死锁状态.
因为这是您的程序的目的.
鉴于您不需要任何锁,最简单的解决方案是删除所有synchronized关键字.
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |