下面的代码可以不使用重写吗 Collections.synchronizedMap() 还保持并发的正确性?

Collections.synchronizedMap(new WeakHashMap<Class, Object>());

IE。有没有 java.util.concurrent 中的东西可以代替?请注意,仅替换为

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));

显然行不通

有帮助吗?

解决方案

番石榴缓存生成器 类可以让你轻松地做到这一点。

CacheBuilder.newBuilder().weakKeys().build()

请注意,这会将键相等语义更改为 == 代替 .equals() 这在你使用的情况下并不重要 Class 实例,但这是一个潜在的陷阱。

其他提示

我不相信有。实际上的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中唯一真正的作品在单线程模型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top