共同点:wait(),wait(long)和sleep(long) 的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态
一方法归属不同
1.sleep(long)是 Thread 的静态方法
2.而 wait(, wait(long)都是 Object 的成员方法,每个对象都有
二醒来时机不同
1.执行 sleep(long)和wait(long)的线程都会在等待相应毫秒后醒来
2.wait(long) 和wait()还可以被 notify 唤醒,wait() 如果不唤醒就一直等下去
3.它们都可以被打断唤醒
三锁特性不同
1.wait 方法的调用必须先获取wait 对象的锁,而 sleep 则无此限制
2.wait 方法执行后会释放对象锁,允许其它线程获得该对象锁(我放弃,但你们还可以用)
3.而sleep 如果在 synchronized 代码块中执行,并不会释放对象锁(我放弃,你们也用不 了)
注意:线程sleep与synchronized解锁,sleep写在synchronized外面与里面的区别。
1.结论:当sleep写在synchronized里面的时候,当前线程会休眠,让出cpu,但是synchronized不会解锁,synchronized锁定的方法或者代码块不会往下执行,临界资源别的线程不能用。
2.结论:当sleep写在synchronized外面的时候,当前线程会休眠,让出cpu,写在外面就和锁没关系了,临界资源别的线程也就可以用了,只不过是让当前线程休息一会罢了。