之前在写代码的时候,如果需要让线程等待一会,就直接使用sleep()方法,一直也没有出过问题。而wait()方法的出场率很高,每次打一个句点的时候,对象的方法弹出来,总是能看到wait()在其中,wait()是一个Object对象中为数不多的方法之一,开始在尝试使用wait()方法的时候总是出错,感觉这个方法很麻烦,但是一直也没有研究这是一个什么样的方法。

最近在研究java同步机制,才知道每个对象中都唯一一个对象锁的东西,这个对象锁的设置就是为了实现传统PV锁的功能。wait()字面上的意思是等待,意思就是等待对象的对象锁。相对应的,notify()方法就是释放对象的对象锁,然后由OS来分配给在等待对象锁的兄弟们,wait()和notify()方法都要在synchronized代码块中使用。

总的来说,wait()方法有sleep()有类似的地方,都是延迟一个方法的运行,但是sleep()一般来说都会设置一个时间参数,或者等待一个interupt()来随时叫醒。而且sleep()方法就是单纯的释放占有CPU的权利,睡起来后再继续工作,没有对对象锁的操作。sleep()还有个很神奇的地方,就是在哪个类中调用sleep()方法,谁就去睡觉。即使在A类中调用B.sleep(1000)方法,也是A去睡觉。

wait()方法一般不设置时间参数,而是等待另一个方法执行完后释放对象锁出来后再开始执行,用对象锁保持一个方法执行的顺序关系,也维护了每次一个方法访问共有变量。巧妙的使用wait()能够轻易的实现很多多线程问题,然而使用不好也很容易造成死锁的问题。