wait/notify 机制的原理
- 拥有相同锁的线程才可以实现 wait/notify 机制
- wait()方法是Object类的方法,它的作用是使当前执行wait方法的线程等待 在wait所在的代码处暂停执行,并释放锁,直到接到通知或被中断为止。
- 在调用wait之前,线程必须获得该对象的对象级别锁,即只能在同步方法和同步代码块中调用,否则抛出 IllegalMonitorStateException,它是 RuntimeException的一个子类。
- notify要在同步方法或同步块中调用。该方法用来通知那些可能等待该锁的其他线程,使该线程重新获取锁。
- 值得注意的是,执行notify方法后,当前线程不会马上释放锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程退出syn同步区域后,当前线程才会释放锁。
线程状态的切换
线程进入Runnable状态大体分为4种情况
- sleep结束
- 线程获得锁
- 线程被notify
- 挂起状态的线程调用了 resume方法
出现阻塞(blocked)
例如,遇到一个IO操作,此时当前线程由runnable转成blocked状态,等待IO结果。OS会将CPU时间片分给其他线程,当IO操作结束,该线程进入runnable状态。
- 线程调用sleep,主动放弃占用的处理器资源
- 调用了阻塞式IO
- 线程试图获得锁,但该锁被其他线程持有
- 线程等待notify
- 线程suspend
wait vs. sleep
- wait 会立即释放锁
- sleep不释放锁
- notify 也不会立即释放锁 必须在执行完notify方法所在的syn代码块后才释放锁