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