java并发编程实战笔记---(第四章)对象的组合
4.1设计线程安全的类
包含三个基本要素:
1.找出构成对象状态的所有变量
2.找出约束状态变量的不变性条件
2.简历对象状态的并发访问管理策略
对象的状态: 域
基本类型所有域, 引用类型包括被引用对象的域
同步策略:不违背对象不变条件下对其状态的访问进行协同。
同步策略规定了如何将不可变性,线程封闭,加锁机制结合起来维护线程的安全性,并且规定了那些变量由哪些锁保护,最好写正式文档。
1.收集同步需求
不变性条件中包含多个变量,任何访问相关变量的操作都需要持有保护这些变量的锁。
2.依赖状态的操作
如果某个操作中包含有依赖状态的先验条件,即为依赖状态的操作。例如集合中取值,需先判断集合不能为空。
并发程序中先验条件可能会因为其他线程变为真,所以并发线程需等待,知道先验条件为真继续执行。
Java中等待某个先验条件为真的机制(等待和通知机制)不容易,可以使用 现有类库中的类入 bolcking queue或者samephore等来实现依赖状态的行为。
4.2实例封闭
讲数据封装在对象内部,讲数据 的访问控制在方法上。
ArrayList hashset 都不是线程安全的,但是有collections.synchronized()。
封闭讲线程安全控制在类中 ,更小的范围内。
1. Java监视器模式
会把对象的所有状态封装起来,并用对象的内置锁来保护状态。
通过复制方式不发布对象
4.3线程安全性的委托
不独立则需要加锁
3.发布底层的状态变量
4.4在现有的线程安全类中添加功能:
要考虑同步策略。
如果扩展该类,需要确保是同一把锁,是否与父类中的同步策略一样。
不是同一个锁,不行
同步封装器类文档指出用的内置锁,所以直接用list对象做锁。
这种客户端加锁很脆弱,将同步分布在多个类中。
相当于用一个新的锁重写整个类。
4.5
总结: