java.util.Collections
目前提供以下实用方法来创建 synchronized
各种集合接口(interface)的包装器:
-
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>
的实用方法。确实如此extends SortedMap
,但 SortedSet extends Set
也是如此,和Set extends Collection
,和Collections
有专门的实用方法 SortedSet
和Set
。大概NavigableMap
是一个有用的抽象,否则它一开始就不会存在,但还没有针对它的实用方法。
所以问题是:
- 是否有具体原因
Collections
不提供NavigableMap
的实用方法? - 你会如何编写自己的
synchronized
NavigableMap
的包装?- 浏览 source code for OpenJDK version of
Collections.java
似乎表明这只是一个“机械”过程- 一般情况下可以添加
synchronized
吗?像这样的线程安全功能吗? - 如果这是一个机械过程,可以自动化吗? (Eclipse插件等)
- 此代码重复是否必要,或者可以通过不同的 OOP 设计模式来避免吗?
- 一般情况下可以添加
- 浏览 source code for OpenJDK version of
最佳答案
这是一个疏忽。 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
包,因为您想扩展 static class SynchronizedSortedMap<K, V>
它被声明为包私有(private)。否则就会有大量的代码复制粘贴。这是一个开始:
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
见解来源:)
我不认为它是(能够)一个机械过程,因为它涉及很多因素。
关于java - 为 NavigableMap 编写同步线程安全包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2839267/