首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

在现有的类下添加一个原子操作

2012-12-23 
在现有的类上添加一个原子操作摘录自《java并发编程实战》?为现有的类添加原子操作推荐用组合的方法。例如为V

在现有的类上添加一个原子操作

摘录自《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是否是安全的,这种方式更加健壮

?

?

?

热点排行