【学习笔记-并发编程实战】第4章 对象的组合

设计线程安全的类

1、构成对象的状态的变量有哪些

2、构造的这些变量的不变性条件

3、控制管理对象状态的并发访问

收集同步需求

什么情况下需要同步,类中是否有一些不变性条件,后验条件,施加在状态及状态转换上的各种约束,当然也包含多个状态之间的相互约束(约束多个状态变量的不变性条件)。

依赖状态的操作

有些状态变量的操作依赖于当前状态中的值,或者叫做先验条件,并发操作可能需要等到某些状态为真才能进行操作。

状态的所有权

状态简单理解即属性,所有权与正常含义一样即所属的控制权。状态被封装在一个类中,如果没有发布,则状态的所有权归类所独有,如果有发布,则共享所有权。

 

实例封闭

将不安全的类属性通过synchronized封闭在方法中,只能通过成员方法直接访问,那么这个状态就相当于被封闭在实例中一样。类似的可以通过装饰器模式将线程不安全的类封装为线程安全的类。

Java监视器模式

将对象所有的可变状态封装起来,通过内置锁或者私有的锁来进行保护,只要状态改变时使用的是同一个锁,就可以确保状态的线程安全,这是一种简单的模式。

基于监视器模式的车辆追踪

将位置状态封装在成员方法中,在需要获取位置时通过deepCopy将包含位置信息的map返回,这样缺陷是,如果数据量很大,copy会很耗时,另外这样不能获取实时数据,因为返回的是拷贝后的数据,书上也说了,这是根据业务需要来进行选择的。

 

线程安全性的委托

将类的线程安全委托给线程安全的状态,确保状态是final且线程安全的,我们就可以认为状态所在的类是线程安全的了。

基于委托的车辆追踪器

这种追踪器直接返回不可修改的对象引用的map作为获取的位置数据,然后通过不可变对象Point来保证位置数据的安全,在设置新的位置的时候,通过创建新的点对位置map进行替换。

独立的状态变量

将线程安全性委托给多个状态变量,但是这些状态变量必须都是独立的,不会增加任何不变性条件。

当委托失效时

状态变量之间包含着约束性条件的时候,导致线程的安全性失效,可以通过加锁机制来维持安全性。

发布底层的状态变量

直接使用书中原话,如果一个状态变量是线程安全的,并且没有任何不变性条件来约束它的值,在变量的操作上也不存在任何不允许的状态转换,那么就可以安全的发布这个变量。

基于发布状态的车辆追踪

返回不可变的副本,调用者不能新增或删除车辆,但是副本中车辆的位置时可变的,通过可变的对象状态实现。

 

在现有的线程安全类中添加功能

直接在类的源代码中修改最好,如果不行,只能通过扩展的方式,但是这种方式一定需要注意是否使用了与原始类相同的同步策略,否则扩展的功能也不是线程安全的

客户端加锁机制

使用客户端的锁对象,而不是使用所在类的类锁对象。详情见P62,一看就明白。

组合

首先继承,然后通过使用java监视器模式来封装原始的类对象,加上同一的锁,这种组合的方式确保扩展的功能是线程安全的。

 

将同步策略文档化

某个类是线程安全的还是不安全,可变性条件是什么,先验条件、后验条件是什么,如何正确的声明,这些都要通过文档的形式书写保存下来,至少是注释,这样方便自己或他人以后进行维护。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值