1、设计线程安全的类
- 找出构成对象状态的所有变量
- 找出约束状态变量的不变形条件
- 建立对象状态的并发访问管理策略
2、实例封闭
将数据封装在对象内部,可以将数据访问限制在访问对象的方法上,从而更容易确保线程在访问数据时总能持有正确锁。
Java监视器模式
public class PrivateLock {
private final Object myLock = new Object();
void someMethod() {
synchronized(myLock) {}
}
}
3、线程安全性的委托
- 委托给不可变的对象 (final)
- 委托给多个相互独立的变量
- 如果一个状态变量时线程安全的,并且没有任何不变性条件来约束它的值,在变量的操作上也不存在任何不允许的状态转换,那么就可以安全地发布这个变量。
4、在现有线程安全类中添加功能
下面第一个例子没有在list上同步
public class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent) list.add(x);
return absent;
}
}
最好的方式是使用组合,在对象本身上进行同步。
public class ImprovedList<T> implements List<T> {
private final List<T> list;
public ImprovedList(List<T> list);
public synchronized boolean putIfAbsent(T x) {
boolean contains = list.contains(x);
if (contains) list.add(x);
return !contains;
}
}