直接上代码:
//死锁类
public class DeadLockSample extends Thread {
private String first;
private String second;
public DeadLockSample(String name,String first,String second){
super(name);
this.first=first;
this.second=second;
}
public void run(){
synchronized (first){
System.out.println(this.getName()+" obtained1: "+first);
try {
Thread.sleep(1000L);
synchronized (second){
System.out.println(this.getName()+" obtained2: "+second);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//下面是测试方法
@org.junit.Test
public void deadLockSample() {
String lockA = "lockA";
String lockB = "lockB";
DeadLockSample t1 = new DeadLockSample("t1", lockA, lockB);
DeadLockSample t2 = new DeadLockSample("t2", lockB, lockA);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (Exception e) {
e.printStackTrace();
}
}
执行快照:
结论:
两个嵌套的 synchronized 去获取锁,都在等待对方释放锁,一直等待,最后循环死锁。
反思:
在使用嵌套同步synchronized时,要理清锁的获取顺序。
以上具体参考"极客时间"栏目 杨晓锋 老师的课程"Java核心技术36讲"。有兴趣,请点击:https://time.geekbang.org/column/82