public class Test22 {
public static void main(String[] args) {
Object lock = new Object();
Thread t1 = new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1运行");
synchronized (lock) {
System.out.println("t1获得锁");
}
},"t1");
t1.start();
new Thread(()->{
synchronized (lock){
System.out.println("t2让t1执行");
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2其他代码");
}
},"t2").start();
}
}
可以看到t2获得了lock锁,然后调用t1.join()让t2执行,此时t2进入t线程的monitor的waitset,等待t1结束才能继续,但是t1线程需要lock锁才能进行,但是lock锁在t2那,t1进入lock锁monitor的entryset里并且永远竞争不到lock锁,无法结束,导致t1无法继续执行释放lock锁,达成死锁