「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
这篇主要是讲 sleep()、wait() 和 notify() 的区别
一、wait() 和 notify() 的理解
- wait()、notify()、notifyAll()是Object类的方法,也就是说每个对象都有wait()、notify()、notifyAll(),所以锁是每个对象的基础,当然操作锁的方法也是最基础了
- 当需要调用这些方法的时候,一定要对竞争资源进行加锁,如果不加锁的话,则会报IllegalMonitorStateException异常
- 当想要调用wait( )进行线程等待时,必须要取得这个锁对象的控制权,一般是放到synchronized(obj)代码中
- notify( )方法只会通知等待队列中的第一个相关线程(不会通知优先级比较高的线程)
- notifyAll( )通知所有等待该竞争资源的线程(也不会按照线程的优先级来执行)
- 假设有三个线程执行了obj.wait( ),那么obj.notifyAll( )则能全部唤醒线程A,线程B,线程C,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,线程A,线程B,线程C 只有一个有机会获得锁继续执行,其余的需要等待释放obj锁之后才能继续执行
- 当调用obj.notify/notifyAll后,调用线程依旧持有obj锁,因此,线程A,线程B,线程C,但是仍无法获得obj锁。直到调用线程退出synchronized块,释放obj锁后,它们中的一个才有机会获得锁继续执行
二、sleep() 的理解
Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常。在哪个线程里面调用sleep()方法就阻塞哪个线程
三、wait() 和 sleep()的区别
-这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类
- wait方法依赖于同步,而sleep方法可以直接调用。而更深层次的区别在于sleep方法只是暂时让出CPU的执行权,并不释放锁。而wait方法则需要释放锁
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
- sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)