- sleep是Thread的静态方法。wait是Object的方法
- sleep想啥时候用就啥时候用。wait需要先获得对象锁,配合synchronized一起使用
- sleep会让出CPU的使用权,但是不会释放对象锁。wait也会让出CPU的使用权,会释放对象锁
- 它们的状态都是TIMED_WAITING
首先明确一点:wait/notify只有重量级锁才有,下面讲的锁都是重量级锁
Wait
每个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向Monitor对象的指针
Monitor的结构如下
获得对象锁的那个线程就是Owner线程
- Owner线程在发现某些条件不满足时,即可调用wait方法,进入WaitSet变为WAITING状态,此时会释放锁,并且不占用CPU时间片。
- WAITING 线程会在 Owner 线程(如果不是Owner线程,即没有获得对象锁就去调用它的 notify 或 notifyAll 会抛出异常)调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入
EntryList 重新竞争
有误请指出,后面有想到新的的再补充上去
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)