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

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值