java.util.Collections
当前提供以下实用程序方法,用于为各种收集接口创建同步包装器:
> synchronizedCollection(Collection<T> c)
> synchronizedList(List<T> list)
> synchronizedMap(Map<K,V> m)
> synchronizedSet(Set<T> s)
> synchronizedSortedMap(SortedMap<K,V> m)
> synchronizedSortedSet(SortedSet<T> s)
类似地,它也有6个unmodifiedXXX重载.
明显的遗漏是NavigableMap<K,V>
的实用程序方法.它的确扩展了SortedMap,但SortedSet扩展了Set,Set扩展了Collection,并且Collections具有用于SortedSet和Set的专用实用程序方法.大概是NavigableMap是一个有用的抽象,否则它本来就不会存在的,但是还没有实用的方法.
所以问题是:
>集合不提供NavigableMap的实用方法的特定原因吗?
>您将如何为NavigableMap编写自己的同步包装器?
>浏览source code for OpenJDK version of Collections.java
似乎表明这只是一个“机械”过程
>是否可以添加像这样的同步线程安全性功能,这是真的吗?
>如果是这样的机械过程,可以自动化吗? (Eclipse插件等)
>是否需要重复此代码,还是可以通过其他OOP设计模式来避免?
解决方法:
这是一个疏忽. The fix is in progress.
Josh writes:
“They definitely belong there. Their absence is unintentional.
We should put them in as soon as possible.”I agree, even though none of us engineers are looking forward
to writing (and testing) all those mind-numbing forwarding methods.
Posted Date : 2006-08-21 00:50:41.0
不过要花一点时间.
更新:关于手动实现它,您可能考虑劫持java.util包,因为您想扩展静态类SynchronizedSortedMap< K,V>.声明为私有包.否则,将会有很多代码复制粘贴.这是一个开始:
package java.util;
import java.util.Collections.SynchronizedSortedMap;
public class NewCollections {
public static <K, V> NavigableMap<K, V> synchronizedNavigableMap(NavigableMap<K, V> m) {
return new SynchronizedNavigableMap<K, V>(m);
}
static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V> implements NavigableMap<K, V> {
private final NavigableMap<K, V> sm;
SynchronizedNavigableMap(NavigableMap<K, V> m) {
super(m);
sm = m;
}
SynchronizedNavigableMap(NavigableMap<K, V> m, Object mutex) {
super(m, mutex);
sm = m;
}
}
}
让IDE自动生成NavigableMap的未实现方法,并像SynchronizedSortedMap一样对它们进行编码.这是一个例子:
@Override
public K ceilingKey(K key) {
synchronized (mutex) { return sm.ceilingKey(key); }
}
请注意,返回例如Set的方法还需要将其包装在SynchronizedSet中.再次,请参阅SynchronizedMap和SynchronizedSortedMap源以获得见解:)
我不希望它是机械过程,因为它涉及很多因素.