《java并发编程实战》笔记(第4章)

来源:互联网 发布:第一源码网 编辑:程序博客网 时间:2024/05/22 08:26

(十九)设计线程安全的类
在设计线程安全类的过程中,需要包含以下三个基本要素:
1.找出构成对象状态的所有变量
2.找出约束状态变量的不变性条件
3.建立对象状态的并发访问管理策略。

19.1– 设计线程安全的类
1.类的不变性条件和后验条件约束了在对象上有哪些状态和状态转换是有效的。
2.某些方法还包含一些基于状态的先验条件(Precondition),称为依赖状态的操作。

(二十)实例封闭 Instance Confinement
实例封闭是构建线程安全类的一个最简单的方式,它使得在锁策略的选择上拥有了更多的灵活性。
对于其他形式的锁来说,只要自始至终都是用同一个锁,就可以保护状态。
封闭机制更易于构造线程安全的类,因为当封闭了类的状态时,在分析类的线程安全性时就无须检查整个程序。
@ThreadSafe
public class PersonSet {
private final Set myset = new HashSet();

  public synchronized void add(E e){        myset.add(e);  }  public synchronized boolean contain(E e){        return myset.contains(e);  }

}
PersonSet的状态由myset来管理 ,而HashSet不是线程安全的。但是由于myset是私有的并且不会逸出,因此hashset被封闭在PersonSet中。
唯一能访问myset的代码为 add和contain方法,在执行它们时候都要获得PersonSet上的锁,PersonSet的状态完全由它的内置锁保护。因此PersonSet
是一个线程安全的类。

(二十一)私有的锁对象好处
public class PrivateLock{
private final Object myLock = new Object();
Widget widget ;

 void someMethod(){      synchronized(){           //访问或修改widget 的状态      } }

}

使用私有的锁对象而不是对象的内置锁,有许多优点:
私有的锁对象可以将锁封装起来,使客户代码无法得到锁,但是客户代码可以通过公有方法来访问锁,以便(正确或者不正确)参与到它的同步策略中。
此外,要想验证某个公有访问的锁在程序中是否被正确的使用,者需要检查整个程序,而不是单个的类。

阅读全文
0 0
原创粉丝点击