以下内容是我在阅读《图解Java多线程设计模式》一书中的总结和思考
本章配图文字:等我准备好哦。
定义
当不符合继续执行时,通过让线程等待来保证实例的安全性。
名字 | 说明 |
Request | 存储信息数据的类 |
RequestQueue | 存放Request实例对象,采用互斥方法来保证对Request实例对象操作时的线程安全 |
ClientThread | 创建Request实例对象并放到queue中 |
ServerThread | 从queue中获取Request实例对象并读取其中的数据 |
Main | 测试程序行为的类 |
结构
while (允许执行的条件的逻辑非)
{
wait();
}
执行操作;
...
// 当queue发生变化之后
notifyAll();
RequestQueue类中有getRequest()和putRequest()方法,它其实就是GuardedObject(被守护的对象),因此这两个方法要互斥操作(都用synchronized修饰)。
使用while而不使用if是因为,当wait()从等待队列中唤醒之后,还需要重新判断是否符合允许执行的条件,而这个只有while可以做到,如果是if的话,当唤醒之后就不再判断条件而是直接执行操作了,这样就是线程不安全。
既然wait()了,就需要有notifyAll()方法了唤醒等待队列中的线程。
提及的JDK类包
- Queue<xx> queue = new LinkedList<xx>(); LinkedList可以上升为Queue类型。remove()时如果没有元素,会抛异常。
- LinkedBlockingQueue类使用了Guarded Suspension模式,因此它是线程安全的。