摘录自《java并发编程实战》
为现有的类添加原子操作推荐用组合的方法。例如为Vector增加一个"若没有则添加"的方法。有以下几种方案:
1. 继承
public class BetterVector<E> extends Vector<E> {
public synchronized boolean putIfAbsent(E x) {
boolean absent = !contains(x);
if (absent)
add(x);
return absent;
}
}
这种方法的缺点很脆弱。因为同步策略实现被分布到多个单独维护的源代码的文件中。如果底层的类改变了同步策略,那么子类就都被破坏掉了。
2。客户端加锁机制
下面这种方式不能保证线程安全性。因为BetterVector和Vector使用了不同的锁。
public class BetterVector<E> {
public Vector<E> vec = new Vector<E>();
public synchronized boolean putIfAbsent(E x) {
boolean absent = vec.contains(x);
if (absent)
vec.add(x);
return absent;
}
}
应该改为
public class BetterVector<E> {
public Vector<E> vec = new Vector<E>();
public boolean putIfAbsent(E x) {
synchronized (vec) {
boolean absent = vec.contains(x);
if (absent)
vec.add(x);
return absent;
}
}
}
但是这种方式同样是脆弱的。因为他将vector的代码加到了与vector完全无关的其他类中。
3。组合
public class BetterVector<E> {
private final Vector<E> vec = new Vector<E>();
public BetterVector(Vector<E> vec){
this.vec = vec;
}
public synchronized boolean putIfAbsent(E x) {
boolean absent = vec.contains(x);
if (absent)
vec.add(x);
return absent;
}
public synchronized void clear(){
vec.clear();
}
}
这种方式不关心底层的vector是否是安全的,这种方式更加健壮