基本介绍
多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生。
例:
妈妈:你先完成作业,才让你玩手机
小明:你先让我玩手机,我才完成作业
模拟线程死锁
package thread_;
/**
* @Author: Gin
* @Description:
* @Modified By: Gin
* @Date: Created in 17:07 2021/9/27
*/
public class DeadLock_ {
public static void main(String[] args) {
// 模拟死锁现象
DeadLockDemo A = new DeadLockDemo(true);
DeadLockDemo B = new DeadLockDemo(false);
A.start();
B.start();
}
}
class DeadLockDemo extends Thread{
// 保证多个线程共享同一个对象
static Object o1 = new Object();
static Object o2 = new Object();
boolean flag;
public DeadLockDemo(boolean flag){
this.flag = flag;
}
@Override
public void run() {
// 以下业务逻辑分析:
// 假设有两条线程 A, B ,分别传入参数 true, false
// 1. flag 为 true,线程 A 就会先得到 o1 对象锁,然后尝试去获取 o2 对象锁
// 2. 如果线程 A 得不到 o2 对象锁,就会被阻塞
// 3. flag 为 false,线程 B 就会先得到 o2 对象锁,然后尝试去获取 o1 对象锁
// 4. 如果线程 B 得不到 o1 对象锁,就会被阻塞
if(flag){
synchronized (o1){
System.out.println(Thread.currentThread().getName() + " 进入 1 ");
synchronized (o2){
System.out.println(Thread.currentThread().getName() + " 进入 2 ");
}
}
}else{
synchronized (o2){
System.out.println(Thread.currentThread().getName() + "进入 3 ");
synchronized (o1){
System.out.println(Thread.currentThread().getName() + " 进入 4 ");
}
}
}
}
}