更新时间:2021-10-24 01:50:08
在设计线程安全类的过程中,需要包含以下三个基本要素:
1. 找出构成对象状态的所有变量
2. 找出约束状态变量的不变性条件
3. 建立对象状态的并发访问管理策略
遵循Java监视器模式的对象会把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护
以下代码是对象使用私有锁的例子:
public class PrivateLock {
private final Object myLock = new Object();
public void doSomething() {
synchronized(myLock) {...}
}
}
委托是创建线程安全类的一个有效手段:只需让现有的线程安全类管理所有的状态即可。
通过多个线程安全类组合而成的类,其线程安全性视情况而定。
要在现有的类中添加线程安全操作,有两种方法:
public class BetterVector<E> extends Vector<E> {
public synchronized boolean putIfAbsent(E x) {
boolean absent = !contains(x);
if (absent) {add(x);}
return absent;
}
}
扩展的方法比直接修改源代码要脆弱,因为同步策略实现被分布到了多个单独维护的源代码文件中。如果底层的类改变了同步策略并选择了不同的锁来保护它的状态变量,那么子类会被破坏。
public class ListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
//verson 1
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent) list.add(x);
return absent;
}
//verson 2
public boolean putIfAbsent(E x) {
synchronized(list) {//使用list自己的锁
boolean absent = !list.contains(x);
if (absent) list.add(x);
return absent;
}
}
}
在文档中说明客户代码需要了解的线程安全性保证,以及代码维护人员需要了解的同步策略