@frank-shaw
2015-10-29T10:52:51.000000Z
字数 1199
阅读 1881
java.多线程
先写一个死锁程序试试吧:
package 死锁;
/*
* 这道题的难点在于两把锁如何设置的问题。需要另外一个类
* 中的两个静态变量来实现这两把锁,而且必须要new
*/
public class DeadLockTest {
public static void main(String[] args) {
Source s1 = new Source(true);
Source s2 = new Source(false);
new Thread(s1).start();
new Thread(s2).start();
}
}
//两把锁
class Lock{
static Object lockA = new Object();
static Object lockB = new Object();
}
class Source implements Runnable{
boolean flag;
public Source(boolean f){
this.flag = f;
}
@Override
public void run() {
while(true){
if(flag){
synchronized(Lock.lockA){
System.out.println("true时候的lockA");
synchronized(Lock.lockB){
System.out.println("true时候的lockB");
}
}
}
else{
synchronized(Lock.lockB){
System.out.println("false时候的lockB");
synchronized(Lock.lockA){
System.out.println("false时候的lockA");
}
}
}
}
}
}
注意,上面的程序写的是针对线程的死锁程序,不过可以类比延伸到进程中去。以下部分来自操作系统的知识,主题对象为进程。那么,让我们来试试分析一下死锁的原因:
一是系统提供的资源数量有限,不能满足每个进程的使用;
二是多道程序运行时,进程推进顺序不合理。
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列预防措施(死锁未发生):
1、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件。这有点流氓啊。
2、采用资源有序分配法,破坏循环等待条件。在资源一开始分配的时候就注重有序分配,一步一步来。
如果死锁已经发生,那么怎么办呢?解除死锁常常采用下面两种方法:
1、资源剥夺法:也就是类似于上面所讲到的流氓做法。
2、撤消进程法:一次撤销一个进程,知道不发生死锁为止。