Java 死锁的实现条件
当竞争资源或进程间推进顺序不当时,可能会出现死锁。
关于死锁出现的条件,我们晦涩难懂的操作系统课本是这样总结的:
1,互斥条件
2,请求和保持条件
3,不剥夺条件
4,环路等待条件
看了这些东西,很多人会感到一头雾水。如果你不是计算机专业科班出身并且成绩不赖的话,也许会很难理解。虽然这些总结非常精辟,但我总觉得国内大部分教材精辟过头了。在Java中,我们并不需要了解这么多细节的东西。死锁产生的原因很简单。线程1锁住资源A等待资源B,线程2锁住资源B等待资源A,两个线程都在等待自己需要的资源 而这些资源被另外的线程锁住,这些线程你等我,我等你,谁也不愿意让出资源,这样死锁就产生了。举一个形象的例子2个人(2个线程)要过一个独木桥(资源),两人走到中间停下来等另外一个人让路,不幸的是没有人愿意让路,于是两人就无限期的等下去了。
程序代码:
public class DeadLockTest implements Runnable ...{
public boolean flag = true;
static Object res1 = new Object();
static Object res2 = new Object();
public void run() ...{
if(flag) ...{
/**//* 锁定资源res1 */
synchronized(res1) ...{
System.out.println(\"Resource 1 is locked. Waiting for Resource 2.\");
try ...{
Thread.sleep(1000);
}
catch (InterruptedException e) ...{}
/**//* 锁定资源res2 */
synchronized(res2) ...{
System.out.println(\"Complete.\");
} [Page]
}
}
else ...{
/**//* 锁定资源res2 */
synchronized(res2) ...{
System.out.println(\"Resource 2 is locked. Waiting for Resource 1.\");
try ...{
Thread.sleep(1000);
}
catch (InterruptedException e) ...{}
/**//* 锁定资源res1 */
synchronized(res1) ...{
System.out.println(\"Complete.\");
}
}
}
}
public static void main(String[] args) ...{
DeadLockTest r1 = new DeadLockTest();
DeadLockTest r2 = new DeadLockTest();
r2.flag = false;
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
}
运行结果:
Resource 1 is locked. [Page]
Waiting for Resource 2.
Resource 2 is locked.
Waiting for Resource 1.