首先我们要理解什么是死锁,简单来说就是相互持有对方的锁
死锁问题概述
如果出现了同步嵌套,就容易产生死锁问题
是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象
死锁:
两个或者两个以上的线程, 在抢占CPU的执行权的时候, 都处于等待状态
举例:
中国人和美国人一起吃饭
中国人使用的筷子
美国人使用的刀和叉
中国人获取到了美国人的刀
美国人获取到了中国人的一根筷子
这个时候中国人和美国人都不能继续进行吃饭的操作
同步代块实现简单的死锁现象
//先创建两把锁:
public interface Lock {
//创建两把锁
public static final Object objA = new Object();
Object objB = new Object();
}
// 线程
public class MyThread1 extends Thread {
//
boolean flag = true;
public MyThread1(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
//这里就是锁套锁的现象
if (flag) {
synchronized (Lock.objA) {
System.out.println("true==objA锁进来了");
synchronized (Lock.objB) {
System.out.println("true==objB锁进来了");
}
}
} else {
synchronized (Lock.objB) {
System.out.println("true==objB锁进来了");
synchronized (Lock.objA) {
System.out.println("true==objA锁进来了");
}
}
}
}
}
//开启线程
public class Mytest {
public static void main(String[] args) {
MyThread1 th1 = new MyThread1(true);
MyThread1 th2 = new MyThread1(false);
th1.start();
th2.start();
}
}
结果可以看到,进程无法结束,进入了死锁现象