WeakHashMap 是否有等效的 java.util.concurrent ?
-
20-09-2019 - |
题
下面的代码可以不使用重写吗 Collections.synchronizedMap()
还保持并发的正确性?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
IE。有没有 java.util.concurrent 中的东西可以代替?请注意,仅替换为
new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
显然行不通
其他提示
我不相信有。实际上的Javadoc建议使用Collections.synchronizedMap()
“最喜欢的集合类,该类是不同步的。甲同步WeakHashMap中可以使用Collections.synchronizedMap方法构建。”
Cafeine 是番石榴高速缓存的流行的竞争对手。
- keys automatically wrapped in weak references
- values automatically wrapped in weak or soft references
用法:
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
.weakKeys()
.weakValues()
.build(key -> createExpensiveGraph(key));
是否包裹WeakHashMap中以同步的地图仍然工作 正确你想要做什么,因为垃圾收集器 直接修改在WeakReferences随时,绕过 同步映射的包装?我认为WeakHashMap中唯一真正的工作在 单线程模式。
截至如上所述,用于WeakHashMap中的文档https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html 具体表示:
“A同步WeakHashMap中可使用被构造 Collections.synchronizedMap方法“
这意味着,我认为这种技术必须与垃圾收集器的行为协同工作(除非文档是越野车!)
如果您使用的是 Java 7 及更高版本,则此用例可以通过以下方式以线程安全的方式解决: ClassValue
https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html 如果您需要使用 remove
, ,仔细考虑并发性并彻底阅读文档。
如果您使用的是 Java 6 或更低版本。不,你必须同步一个WeakHashMap。
是否包裹WeakHashMap中以同步的地图仍然正常工作,你想做的事,因为垃圾收集器可以随时直接修改在WeakReferences,绕过同步地图包装?我认为WeakHashMap中唯一真正的作品在单线程模型。