大神帮我分析一下这个多线程程序的运行过程!!!!!!!

class A
{ public synchronized void foo( B b )
{ System.out.println("当前线程名: " + Thread.currentThread().getName()
+ " 进入了A实例的foo()方法" ); // ①
try
{ Thread.sleep(200); }
catch (InterruptedException ex)
{ ex.printStackTrace(); }
System.out.println("当前线程名: " + Thread.currentThread().getName()
+ " 企图调用B实例的last()方法"); // ③
b.last();
}
public synchronized void last()
{ System.out.println("进入了A类的last()方法内部"); }
}
class B
{ public synchronized void bar( A a )
{ System.out.println("当前线程名: " + Thread.currentThread().getName()
+ " 进入了B实例的bar()方法" ); // ②
try
{ Thread.sleep(200); }
catch (InterruptedException ex)
{ ex.printStackTrace(); }
System.out.println("当前线程名: " + Thread.currentThread().getName()
+ " 企图调用A实例的last()方法"); // ④
a.last();
}
public synchronized void last()
{ System.out.println("进入了B类的last()方法内部"); }
}
public class DeadLock implements Runnable
{ A a = new A(); B b = new B();
public void init()
{ Thread.currentThread().setName("主线程");
// 调用a对象的foo方法
a.foo(b); System.out.println("进入了主线程之后");
}
public void run()
{ Thread.currentThread().setName("副线程");
// 调用b对象的bar方法
b.bar(a); System.out.println("进入了副线程之后");
}
public static void main(String[] args)
{ DeadLock dl = new DeadLock();
// 以dl为target启动新线程
new Thread(dl).start(); dl.init();
}
}

这运行的了吗?A 调用 foo( B b )方法的时候拿到了锁 然后停了200ms 之后再调用 last(),由于foo( B b )的锁还没有释放,无法进入last,线程应该会死锁
B应该也一样吧。

不好意思,解释得有问题,应该是,a调用b的last方法的时候,因为本身的锁是A的对象,但是要调用b的last需要b的对象,必须要有b的对象作为锁,一个线程不可能同时有两把锁,所以会死锁