sleep和wait的区别
1,基本的区别
- sleep是Thread类的方法,wait是Object类中定义的方法
- sleep方法可以在任何地方调用
- wait方法只能在synchronized方法或synchronized块中使用
2,最主要的本质区别
- Thread.sleep只会让出CPU,不会导致锁行为的改变
- Object.wait不仅让出CPU,还会释放已经占有的同步资源锁
下面来验证一下这些差别。
新建一个测试类,添加如下代码:
package thread;
public class WaitSleepDemo {
public static void main(String[] args) {
final Object lock = new Object();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread A is waiting to get lock");
synchronized (lock) {
try {
System.out.println("thread A get lock");
Thread.sleep(20);
System.out.println("thread A to wait method");
lock.wait(1000);
System.out.println("thread A is done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread B is waiting to get lock");
synchronized (lock) {
try {
System.out.println("thread B get lock");
System.out.println("thread B is sleeping 10ms");
Thread.sleep(10);
System.out.println("thread B is done");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
如果我们把线程A中的wait改为sleep,会怎样呢?看代码:
为什么wait必须写在synchronize里面呢?因为wait是释放锁的,所以是必须得先得到锁才能释放,而synchronize会保证先得到锁,然后wait在里面才能释放锁。