Java多线程并发环境下的synchronized死锁实例
Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2;而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。
例如:
public class MainClass {
private Object lock1 = new Object();
private Object lock2 = new Object();
public static void main(String[] args) {
MainClass mainClass = new MainClass();
mainClass.demo();
}
private void demo() {
Thread ta = new Thread(new DeadA());
Thread tb = new Thread(new DeadB());
ta.start();
tb.start();
}
private class DeadA implements Runnable {
private String id = "A";
@Override
public void run() {
System.out.println(id + " 申请锁1...");
synchronized (lock1) {
System.out.println(id + " 获得锁1");
System.out.println(id + " 申请锁2...");
synchronized (lock2) {
//A得不到锁2,死锁
System.out.println(id + "获得锁2");
}
}
System.out.println(id + " 运行结束");
}
}
private class DeadB implements Runnable {
private String id = "B";
@Override
public void run() {
System.out.println(id + " 申请锁2...");
synchronized (lock2) {
System.out.println(id + " 获得锁2");
System.out.println(id + " 申请锁1...");
synchronized (lock1) {
//B得不到锁1,死锁
System.out.println(id + " 获得锁1");
}
}
System.out.println(id + " 运行结束");
}
}
}
输出:
B 申请锁2...
A 申请锁1...
B 获得锁2
A 获得锁1
B 申请锁1...
A 申请锁2...