图解java多线程设计模式-第三章 Guarded Suspension 模式

以下内容是我在阅读《图解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类包

  1. Queue queue = new LinkedList(); LinkedList可以上升为Queue类型。remove()时如果没有元素,会抛异常。
  2. LinkedBlockingQueue类使用了Guarded Suspension模式,因此它是线程安全的。

你可能感兴趣的:(阅读)