java中sleep()和wait()的区别

java中sleep()和wait()的区别,第1张

java中sleep()和wait()的区别 sleep(long n) 和 wait(long n)的区别
  1. sleep是Thread的静态方法。wait是Object的方法
  2. sleep想啥时候用就啥时候用。wait需要先获得对象锁,配合synchronized一起使用
  3. sleep会让出CPU的使用权,但是不会释放对象锁。wait也会让出CPU的使用权,会释放对象锁
  4. 它们的状态都是TIMED_WAITING

首先明确一点:wait/notify只有重量级锁才有,下面讲的锁都是重量级锁

Wait

每个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向Monitor对象的指针
Monitor的结构如下


获得对象锁的那个线程就是Owner线程
  1. Owner线程在发现某些条件不满足时,即可调用wait方法,进入WaitSet变为WAITING状态,此时会释放锁,并且不占用CPU时间片。
  2. WAITING 线程会在 Owner 线程(如果不是Owner线程,即没有获得对象锁就去调用它的 notify 或 notifyAll 会抛出异常)调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入
    EntryList 重新竞争

有误请指出,后面有想到新的的再补充上去

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5596684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存