下面业务逻辑的分析
1.如果 flag 为 T,线程 A 就会先得到 / 持有 o1 对象锁,然后尝试去获取 o2 对象锁
2.如果线程 A 得不到 o2 对象锁,就会 Blocked
3.如果 flag 为 F ,线程 B 就会先得到 / 持有 o2 对象锁,然后尝试去获取 o1 对象锁
4.如果线程 B 得不到 o1 的对象锁。就会 Blocked
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
static Object o2 = new Object();
boolean flag;
public DeadLockDemo(boolean flag) {//构造器
this.flag = flag;
}
public void run() {
/**下面业务逻辑的分析
* 1.如果 flag 为 T,线程 A 就会先得到 / 持有 o1 对象锁,然后尝试去获取 o2 对象锁
* 2.如果线程 A 得不到 o2 对象锁,就会 Blocked
* 3.如果 flag 为 F ,线程 B 就会先得到 / 持有 o2 对象锁,然后尝试去获取 o1 对象锁
* 4.如果线程 B 得不到 o1 的对象锁。就会 Blocked
*/
if (flag) {
synchronized (o1) {//对象互斥锁
System.out.println(Thread.currentThread().getName() + "进入1");
synchronized (o2) {//这里获得li对象的监视权
System.out.println(Thread.currentThread().getName() + "进入2");
}
}
} else {
synchronized (o2) {//
System.out.println(Thread.currentThread().getName() + "进入3");
synchronized (o1) {//这里获得li对象的监视权
System.out.println(Thread.currentThread().getName() + "进入4");
}
}
}
}
}
写代码的时候,一定要避免这种业务逻辑