sleep 和 wait 区别
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(); } }