当两个线程循环依赖于一对同步对象(monitor)时将发生死锁。马克-to-win例如:一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchronized 方法,同时,反向的情况也发生,就将发生死锁。
死锁很少发生,但一旦发生就很难调试。
在以下例子中:马克-to-wina正在等待b释放,b也正在等待a释放,只要a能往前移动一个语句,a就能释放锁,但下一个语句是等待b释放锁。所以大家就在这互相等,从而发生了死锁。
对于下面的例子:马克-to-wind1.start()作为一个线程,获得d1的锁。为什么?因为synchronized public voidrun().所以run()的synchronized不能去掉。d2.start()作为一个线程获得d2的锁。没有问题,所以打印出来两个“inrun”。然后,在d1’s run()的d.disp()使得d1试图从d2获得一个锁,因为在这一刻,d.disp()意味着d1.d.disp()=d2.disp(),意味着d1试图得到一个锁从d2,反之亦然。
如果任何synchronized 删除,不会发生死锁,但安全性降低。
例1.10.1-本章源码
class DeadLockExam extends Thread {
DeadLockExam d;
synchronized void disp() {
System.out.println(“in di”);
}
synchronized public void run() {
System.out.println(“in ru”);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
d.disp();
}
}
public class TestMark_to_win {
public static void main(String[] args) {
DeadLockExam d1 = new DeadLockExam();。。。。。。。。。。。。。。。。。
详情请进:http://www.mark-to-win.com/index.html?content=JavaBeginner/javaUrl.html&chapter=JavaBeginner/JavaBeginner6_web.html#ConceptExampleOfDeadLock