wait和sleep的本质区别
wait和sleep的本质区别
先看一下他们的定义:
wait:线程等待,调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。
sleep:线程睡眠,sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态
- 对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于Object 类中的。
![]()

-
sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
-
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()会释放锁。


浙公网安备 33010602011771号