在现有的类上添加一个原子操作
摘录自《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是否是安全的,这种方式更加健壮
?
?
?