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

 

 总结:

 

posted @ 2017-06-06 11:14  上台阶  阅读(225)  评论(0编辑  收藏  举报