![](/img/trans.png)
[英]Collections.synchronizedMap(new LinkedHashMap()); is not making Map threadsafe
[英]How to convert Collections.synchronizedMap(new HashMap()) to Hash Map
我们有一个返回HashMap的接口。
现在由于线程安全,我们已经使用
Collections.synchronizedMap(new HashMap());
现在,使用我们的Interface面对类的客户端强制抛出异常,因为
Collections.synchronizedMap返回一个同步映射,并且不能将其强制转换为哈希映射
我们必须将此syncedMap转换回哈希图
有没有办法转换由...返回的syncedMap
将Collections.synchronizedMap()返回到哈希图。
并不完美,但也许可以在您的情况下使用:创建一个扩展HashMap的类,但该类在内部具有同步的Map。 然后,将所有方法调用委托给您的内部映射。 在构造函数上,创建一个新的HashMap,然后对其进行同步。 像这样:
public class SynchronizedHashMap<K, V> extends HashMap<K, V> {
private Map<K, V> internalMap;
public SynchronizedHashMap(int initialCapacity, float loadFactor) {
internalMap = Collections.synchronizedMap(new HashMap<>(initialCapacity, loadFactor));
}
public SynchronizedHashMap(int initialCapacity) {
internalMap = Collections.synchronizedMap(new HashMap<>(initialCapacity));
}
public SynchronizedHashMap() {
internalMap = Collections.synchronizedMap(new HashMap<>());
}
public SynchronizedHashMap(Map<? extends K, ? extends V> m) {
internalMap = Collections.synchronizedMap(new HashMap<>(m));
}
@Override public int size() {
return internalMap.size();
}
@Override public boolean isEmpty() {
return internalMap.isEmpty();
}
@Override public boolean containsKey(Object o) {
return internalMap.containsKey(o);
}
...
}
请记住,这就是为什么您应该为接口编码,而不是为具体实现编码。 您的界面应该返回一个Map,而您的客户端应该使用一个Map,而不必知道它是哪个 Map。
可以吗:
Map hashMap = new HashMap();
Map syncMap = Collections.synchronizedMap(hashMap);
HashMap m = new HashMap(syncMap);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.