造成死锁的根本原因至少存在两个任务相互等待,根据这个思想就可以设计两个同步对象,让他们都有机会先执行
1.创建LockA
package com.kwg;
/**
* @author wengQ
* @Title:
* @Description:同步对象B
* @date 2020-07-15 08:17
*/
public class LockA {
private LockA(){}
public static LockA lockA = new LockA();
}
2.创建LockB
package com.kwg;
/**
* @author wengQ
* @Title:
* @Description:同步对象B
* @date 2020-07-15 08:17
*/
public class LockB {
private LockB(){}
public static LockB lockB = new LockB();
}
3.创建线程任务对象
package com.kwg;
/**
* @author wengQ
* @Title:
* @Description:不管创建多少个线程任务对象,只要保证锁住的是同一个同步对象即可
* @date 2020-07-15 08:14
*/
public class DeadLock implements Runnable{
//标识,让LockA或者LockB先执行
private Boolean flag;
public DeadLock(Boolean flag) {
this.flag = flag;
}
@Override
public void run() {
while (true){//用死循环的目的是让任务一直执行下去
if (flag){
synchronized (LockA.class){
System.out.println("if...LockA");
synchronized (LockB.class){
System.out.println("if...LockB");
}
}
}else {
synchronized (LockB.class){
System.out.println("else...LockB");
synchronized (LockA.class){
System.out.println("else...LockA");
}
}
}
}
}
}
4.执行测试
package com.kwg;
/**
* @author wengQ
* @Title:
* @Description: 测试
* @date 2020-07-15 08:20
*/
public class DeadLockTest {
public static void main(String[] args) {
//创建两个线程任务对象
//设置标识的目的是让两个线程LockA和LockB都有机会先执行
DeadLock d1 = new DeadLock(true);//if...LockA if...LockB
DeadLock d2 = new DeadLock(false);//else...LockB else...LockA
//创建两个线程
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
//启动线程
t1.start();
t2.start();
}
}
一个基本的死锁就实现了,后续解析再补上