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

本文深入探讨了Java多线程设计中的GuardedSuspension模式,解释了如何通过线程等待确保实例安全性,详细分析了RequestQueue类的实现原理,并讨论了线程间通信的正确方式。

以下内容是我在阅读《图解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<xx> queue = new LinkedList<xx>(); LinkedList可以上升为Queue类型。remove()时如果没有元素,会抛异常。
  2. LinkedBlockingQueue类使用了Guarded Suspension模式,因此它是线程安全的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值