public class Test {
private static final Object obj = new Object();
public static void main(String[] args) {
new Thread( ()-> {
synchronized (obj){ // 尝试获取锁
// 1
System.out.println("线程1获取到锁");
try {
// 2
System.out.println("线程1 wait [释放锁]");
obj.wait(); // wait() [会释放锁],如果没有再次获取到 list 锁,就会一直等下去
} catch (InterruptedException e) {
e.printStackTrace();
}
// 3
System.out.println("线程1再次获取到锁");
// 4
System.out.println("线程1结束");
}
}).start();
new Thread( ()-> {
synchronized (obj){ // 尝试获取锁,如果获取失败,就不会进入线程体
// 1
System.out.println("线程2获取到锁");
try {
// 2
System.out.println("线程2休眠2秒,不会释放锁");
Thread.sleep(2000); // 休眠,不会释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
// 3
System.out.println("线程2 notify , 唤醒线程1[释放锁]");
obj.notify(); // 唤醒处于等待 list 锁的线程 [会释放锁]
// 4
System.out.println("线程2结束");
}
}).start();
}
}