sleep:方法来自于thread类;不释放对象锁;需要捕获异常;任何地方都可以用。
wait:方法来自于object类;释放对象锁;不需要捕获异常;只有在同步代码块/方法中才能使用。
sleep注意的点:
sleep的Thread类中的静态方法。静态方法意味着什么?举个例子:A线程有一个sleep(),B线程有一个sleep()。A线程调用B线程的sleep(),那么谁睡着了?答案是A。因为sleep()方法其实不分你我,它是大家的,谁用谁睡。
不释放对象锁 和 释放对象锁 意味着什么?
不释放对象锁意味着线程仍旧处于同步状态,不允许任何线程调用sleep()外的synchronized。当睡醒之后等待CPU时间片控制分配。
释放对象锁,其他线程可以进入synchronized方法执行。并且只能被唤醒之后才能有权利继续执行,注意是有权利。就是说回到线程争取CPU时间的位置上。
wait为啥必须在synchronized里使用?
首先执行wait之后是需要notify或者notifyAll唤醒的。这三个方法为啥必须在synchronized的关键字里面?因为wait的特性是释放锁,没锁怎么释放...所以必须保证它得有锁。
既然上面提到wait的唤醒,那么这个过程怎么理解?
对于Java虚拟机中运行程序的每个对象来说,都有两个池,锁池和等待池。
执行wait之后,线程进入等待池,等待池里的线程不会去争夺锁的占有权,需要别人来把它从等待池里拉出来。当调用的notify或者notifyAll时,该方法把线程从等待池来出来放回到锁池,在锁池里可以公平争夺锁的占有权了。
那它这么费劲儿的去拿锁的占有权干啥?当然是为了最后的CPU使用时间。谁不想早点干完活下班?