思维导图:
引言:
在前两篇文章中,我们介绍了如何判断一个类是否是线程安全的,也介绍了如何判断一个变量是否可以被其他线程使用,即可见性。以上两篇文章是构造线程安全类的基础。在此基础之上,我们将这在这篇文章中,初步地介绍如何从无到有或者利用已有的线程安全类的资源构造我们自己的线程安全的类。按照惯例,文章大体分成两部分:
- 理论部分:我称之为同步要素分析,即分析当前组合类所拥有的的对象(状态),以及他们之间互相约束的条件。
- 使用部分:我称之为同步管理策略,即在分析了当前的状态和约束条件后,选择不同的方式构建所需要的线程安全类。
一.同步要素分析
构造一个线程安全的类,我们需要对类中的两类要素进行分析,状态和状态的约束条件
1.1 构成对象状态的变量
对于一个类来说,域变量是决定其是否线程安全的要素之一。但是,域变量和域变量所包含的域变量(递归成引用树)却不全都是当前类的状态。那么,什么样的域变量才属于类的状态呢?
若当前类的所有域变量都是基本类型,那么所有的基本类型变量都是类的状态。
若当前类含有对象引用,而此引用所含有的部分域变量的控制权不在当前类中(即未发布到当前类)时,那么,此引用对象的这部分域变量不属于当前类的状态,如果当前类可以控制引用对象的域变量则属于当前类的状态。
1.2 约束变量的条件
要构造一个线程安全的类,必不可少的考虑条件就是状态之间的约束关系。一般来说,我们可以从以下几点分析状态间的约束关系:
- 不变性条件:即状态和状态之间存在逻辑联系,例如x是个自然数,y[] 则是x因式分解后的数构成的数组,那么x和y[]之间是 存在不变性条件的。
- 后验性条件:即状态的改变需要由以前的条件决定,典型的例子是x = x + 1,新x是由老x的值决定的。
- 状态性条件:即状态的改变与否由另一个状态的状态决定,例如进行非空判断后再执行部分代码。
二.同步管理策略
在分析了上述的两大要素后,我们根据不同的情况采用不同的手段来构建一个线程安全的类。
2.1 监视器模式
当我们想从无到有或者将手头上非线程安全的类转化为一个线程安全的类时,监视器模式是非常适合的。其核心就是