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();

    }
}

 

posted @ 2019-05-23 11:33  huanggy  阅读(201)  评论(0编辑  收藏  举报