wait和sleep的本质区别

wait和sleep的本质区别

先看一下他们的定义:

wait:线程等待,调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。

sleep:线程睡眠,sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态

  1. 对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于Object 类中的。

  1. sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

  2. sleep()使用时不需要使用syncronized加上同步锁,但是wait()需要。

    /**
     * @program: ThreadDemo
     * @description: wait和sleep的本质区别
     * @author: hs96.cn@Gmail.com
     * @create: 2020-09-07
     */
    public class DifferenceOfWaitAndSleep {
        public static final Object LOCK = new Object();
        public static void main(String[] args) {
            m1();
            m2();
        }
    
        // 休眠2秒正常结束
        public static void m1() {
            try {
                Thread.sleep(2_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void m2() {
            try {
                LOCK.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

运行效果如下:

4.sleep()时不会释放同步锁,但是wait()会释放。

我们先试一下啊sleep

public class DifferenceOfWaitAndSleep {
    public static final Object LOCK = new Object();

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    m1();
                }
            }).start();
        }
    }

    public static void m1() {
        synchronized (LOCK){
            try {
                System.out.println(Thread.currentThread().getName());
                Thread.sleep(3_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行效果如下:

可以看到sleep()时不会释放同步锁。那么wait呢?

public class DifferenceOfWaitAndSleep {
    public static final Object LOCK = new Object();

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    m1();
                }
            }).start();
        }
    }

    public static void m1() {
        synchronized (LOCK){
            try {
                System.out.println(Thread.currentThread().getName());
                LOCK.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行效果如下:

可以看到几乎是同时执行的,也就是wait()会释放锁。

posted @ 2020-09-07 02:46  风暴松鼠  阅读(460)  评论(0)    收藏  举报