死锁的意思其实就是相互等待。一个生活中的简单例子:我们去包子铺吃包子。
客户坚持:先吃包子,后付钱。
卖家坚持:先付钱以后,才能吃包子。
两边如果都坚持自己的原则,对于客户买包子,卖家卖包子赚钱这件事都阻塞在这里了,相持不下,就好像程序“死”在那里一样。
首先创建两把锁。
/**
* Created by liwei on 16/7/18.
*
* 测试流程:测试死锁现象
*
*/
public class MyLock {
// 创建两把锁对象
public static final Object objA = new Object();
public static final Object objB = new Object();
}
竞争资源:
/**
* Created by liwei on 16/7/18.
*/
public class DieLock extends Thread {
// 设置一个旗标,控制线程的执行与停止
private Boolean flag;
public DieLock(Boolean flag){
this.flag = flag;
}
@Override
public void run(){
if(flag){
synchronized (MyLock.objA){
System.out.println("if A");
synchronized (MyLock.objB){
System.out.println("if B");
}
}
}else {
synchronized (MyLock.objB){
System.out.println("else B");
synchronized (MyLock.objA){
System.out.println("else A");
}
}
}
}
}
测试代码:
/**
* Created by liwei on 16/7/18.
*/
/*
* 同步的弊端:
* A:效率低
* B:容易产生死锁
*
* 死锁:
* 两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象。
*
* 举例:
* 中国人,美国人吃饭案例。
* 正常情况:
* 中国人:筷子两支
* 美国人:刀和叉
* 现在:
* 中国人:筷子1支,刀一把
* 美国人:筷子1支,叉一把
*/
public class DieLockDemo {
// 深入分析一下死锁产生的原因
// 听一下别人是怎么分析这个问题的
public static void main(String[] args) {
DieLock dl1 = new DieLock(true);
DieLock dl2 = new DieLock(false);
dl1.start();
dl2.start();
}
}