zoukankan      html  css  js  c++  java
  • Adding Functionality to Existing Thread safe Classes

    要实现一个增强版的线程安全类,有很多方法,但是目前我所知道最好的是使用组合方法。

    比如要在线程安全的List中增加put-if-absent功能,可以这样:

    @ThreadSafe
    public class ImprovedList<T> implements List<T> {
    private final List<T> list;
    public ImprovedList(List<T> list) { this.list = list; }
    public synchronized boolean putIfAbsent(T x) {
    boolean contains = list.contains(x);
    if (contains)
    list.add(x);
    return !contains;
    }
    public synchronized void clear() { list.clear(); }
    // ... similarly delegate other List methods
    }

      Java类库中的Collections.synchronizedXxx也是这样做的,看来这种方法不错。

    当然还有别的方法:

    使用继承

    1 @ThreadSafe
    2 public class BetterVector<E> extends Vector<E> {
    3 public synchronized boolean putIfAbsent(E x) {
    4 boolean absent = !contains(x);
    5 if (absent)
    6 add(x);
    7 return absent;
    8 }
    9 }

      使用客户端锁机制

     1 @ThreadSafe
    2 public class ListHelper<E> {
    3 public List<E> list =
    4 Collections.synchronizedList(new ArrayList<E>());
    5 ...
    6 public boolean putIfAbsent(E x) {
    7 synchronized (list) {
    8 boolean absent = !list.contains(x);
    9 if (absent)
    10 list.add(x);
    11 return absent;
    12 }
    13 }
    14 }

      但是好像都不是很好,详细参见《Java concurrency in practice》

    当然,应该说没有最好吧,只有最适合才正确。因为组合方法要实现内部集合的所有操作,而这些是乏味、无趣的,客户端锁机制的话则只需实现想添加的操作就可以了。

  • 相关阅读:
    一个网络扫描程序
    ASCII
    一个linux下c++程序
    VC数字图像处理编程
    人际关系的55个绝招
    一些函数
    【转】Vim命令合集以及乱码问题解决
    【转】PHP程序员的技术成长规划
    【转】Nginx 服务器安装及配置文件详解
    【转】PHP网站常见安全漏洞,及相应防范措施总结
  • 原文地址:https://www.cnblogs.com/freewater/p/2139669.html
Copyright © 2011-2022 走看看