一、设计线程安全的类
1、三个基本要素:
- 找出构成对象状态的所有变量:理解为域(基本类型、引用)
- 找出约束状态变量的不变性条件:用于判断状态是有效的还是无效的,eg. long value = 0 这个value域是long类型的变量,其状态空间从为Long.MIN_VALUE到Long.MAX_VALUE,但是不能为负值,这就是不可变的限制条件
- 建立对象状态的并发性访问管理策略:就是不变性条件并发访问的情况下不被破坏
2、实例封闭
如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全地使用。你可以确保该对象只能由单个线程访问(线程封闭),或者通过一个锁来保护对该对象的所有访问。
封装简化了线程安全类的实现过程,它提供了一种实例封闭机制(instance Confienement)。当一个对象被封装到另一个对象中时,能够访问被封装对象的所有代码路径都是已知的。
public class PersonSet {
private final Set<Person> mySet = new HashSet<Person>();
public synchronized void addPerson(Person p) {
mySet.add(p);
}
public synchronized boolean containPerson(Person p) {
return mySet.contains(p);
}
}
3、Java监视器模式
从线程封闭原则及其逻辑推理可以得出Java监视器模式。遵循Java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护
public class PrivateLock {
private final Object myLock = new Object();
void someMethod() {
synchronized (myLock) {
//do something
}
}
}