先举个栗子。
/**
* Created by Benjamin on 07/30/030.
*/
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag = " + flag);
if (flag==1){
synchronized (o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("1");
}
}
}
if (flag==0){
synchronized (o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
TestDeadLock t1 = new TestDeadLock();
TestDeadLock t2 = new TestDeadLock();
t1.flag = 1;
t2.flag = 0;
new Thread(t1).start();
new Thread(t2).start();
}
}
产生死锁的原因主要是:
- 系统资源不足
- 资源分配不当
- 推进顺序不合适
产生死锁的四个必要条件:
- 互斥:一个资源每次只能被一个进程使用
- 资源保持:一个进程被阻塞时,不释放已有资源
- 不可抢占:正在使用的资源不能被剥夺
- 循环等待:循环等待未被分配的资源
例子死锁的原因:
静态对象o1和o2是类的资源。当flag=1
的线程请求到o1资源时,再申请资源o2时,o2资源已经被flag=0
的线程占有,并且后者需要申请资源o1才能继续执行。这样,二者就形成了相互等待的情形,故而形成死锁。
网友评论