1、设计线程安全的类
设计线程安全类的过程应该包括下面3个基本要素:
1)确定对象状态是由哪些变量构成的;
2)确定限制状态变量的不变约束;
3) 制定一个管理并发访问对象状态的策略。
不理解对象的不变约束和后验条件,你就不能保证线程安全性。要约束状态变量的有效值或者状态转换,就需要原子性与封装性。
2、实例限制
将数据封装在对象内部,把对数据的访问限制在对象的方法上,更易确保线程在访问数据时总能获得正确的锁。
public class PersonSet{ private final Set mySet = new HashSet(); public synchronized void addPerson(Person p){ mySet.add(p); } public synchronized boolean containsPerson(Person p){ return mySet.contains(p); } }
3、委托线程安全
如果一个类由多个彼此独立的线程安全的状态变量组成,并且类的操作不包括任何无效状态转换时,可以将线程安全委托给这些状态变量。
4、向已有线程安全类添加功能
5、同步策略文档化
为类的用户编写线程安全性担保的文档;为类的维护者编写类的同步策略文档。