您的位置:首页 > Web前端

Adding Functionality to Existing Thread safe Classes

2011-08-15 17:13 92 查看
要实现一个增强版的线程安全类,有很多方法,但是目前我所知道最好的是使用组合方法。

比如要在线程安全的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也是这样做的,看来这种方法不错。

当然还有别的方法:

使用继承

@ThreadSafe
public class BetterVector<E> extends Vector<E> {
public synchronized boolean putIfAbsent(E x) {
boolean absent = !contains(x);
if (absent)
add(x);
return absent;
}
}


  使用客户端锁机制

@ThreadSafe
public class ListHelper<E> {
public List<E> list =
Collections.synchronizedList(new ArrayList<E>());
...
public boolean putIfAbsent(E x) {
synchronized (list) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
}


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

当然,应该说没有最好吧,只有最适合才正确。因为组合方法要实现内部集合的所有操作,而这些是乏味、无趣的,客户端锁机制的话则只需实现想添加的操作就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: