目 录CONTENT

文章目录

wait和sleep

在水一方
2022-02-11 / 0 评论 / 0 点赞 / 417 阅读 / 765 字 / 正在检测是否收录...

前言

wait和sleep这部分知识点事比较容易混淆和不好理解的知识点,涉及到线程和锁方面的知识点,也是面试当中经常问的知识点,本小结来做一个小结

wait是Object类中一个方法,先来看看api中对于该方法的说明。在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行

sleep 和 wait 有什么区别?

sleep 和 wait 几乎是所有面试中必问的题,但想完全回答正确似乎没那么简单。对于 sleep 和 wait 的区别,通常的回答是这样的:
wait 必须搭配 synchronize 一起使用,而 sleep 不需要;
进入 wait 状态的线程能够被 notify 和 notifyAll 线程唤醒,而 sleep 状态的线程不能被 notify 方法唤醒;wait 通常有条件地执行,线程会一直处于 wait 状态,直到某个条件变为真,但是 sleep 仅仅让你的线程进入睡眠状态;wait 方法会释放对象锁,但 sleep 方法不会。
但上面的回答显然遗漏了一个重要的区别,在调用 wait 方法之后,线程会变为 WATING 状态,而调用 sleep 方法之后,线程会变为 TIMED_WAITING 状态。

如何证明wait是释放锁sleep不释放锁

抛异常的情况

直接调用而不在synchronized()中调用wait方法时会抛异常
image.png
根据Api查询该异常的原因是:
image.png

后面继续完善................

参考博客:https://blog.csdn.net/weixin_39636102/article/details/113323853

0

评论区