wait与notify
wait与notify
为什么要放在synchronized中
wait和notify是用来实现多个线程之间的一个协调
- wait表示让线程进入阻塞状态
- notify表示让阻塞线程唤醒
wait和notify是成对出现的,如果一个线程被wait方法阻塞了,那么必然需要另外一个线程通过notify方法进行唤醒,从而实现多个线程之间的通信
在多线程中,要实现多个线程之间的通信,除了管道流之外,只能通过共享变量的方法来实现,也就是说线程t1修改线程变量s,线程t2获得修改后的共享变量s的值,从而去完成线程之间的通信,但是多线程具有并行执行的特性,就是说在同一个时刻,多线程可以通知来操作共享变量。
那么线程t2就必须直到t1已经修改了共享变量s,否则就要进行等待,t1在修改之后,必须要将处在等待的线程t2唤醒
这个时候就需要一个静态条件,去控制线程什么时候条件等待,而什么时候条件唤醒
而synchronized同步关键字就可以实现这样一个互斥的条件
也就是在通过共享变量来实现多线程通信的场景下,参与通信的线程必须要去竞争到这个共享变量的一个锁资源,才能够对共享变量进行修改,修改完之后释放锁,其他线程就可以再次竞争同一个共享变量的锁,来获得共享数据,从而去完成线程之间的通信
在synchronized中可以实现条件等待和条件唤醒
为了避免wait和notify的错误使用,JDK强制要求把wait和notify写在synchronized中
否则会抛出IllegalMonitorStateException
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WereAsh!
评论
ValineDisqus