当竞争资源或进程间推进顺序不当时,可能会出现死锁。
关于死锁出现的条件,我们晦涩难懂的操作系统课本是这样总结的:
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.");
}
}
}
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.
Waiting for Resource 2.
Resource 2 is locked.
Waiting for Resource 1.
。。。(死锁)
本文通过一个简单的Java示例解释了死锁的概念。当两个或多个线程互相等待对方持有的资源时,就会发生死锁,导致程序停滞不前。文章通过独木桥比喻形象地说明了这一现象,并提供了一个具体的代码示例。
400

被折叠的 条评论
为什么被折叠?



