有没有java.util.concurrent相当于WeakHashMap?

下面的一段代码是否可以使用Collections.synchronizedMap()重写而不保持并发性的正确性?

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

即有什么来自java.util.concurrent可以用来代替? 请注意,只是replace为

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

显然是行不通的

番石榴的CacheBuilder类允许你轻松地做到这一点。

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

请注意,这将关键相等语义更改为==而不是.equals() ,这不会影响您使用Class实例的情况,但是是一个潜在的隐患。

我不相信有。 实际上,javadocbuild议使用Collections.synchronizedMap()

“像大多数集合类一样,这个类不是同步的,可以使用Collections.synchronizedMap方法构造同步的WeakHashMap。”

将WeakHashMap封装在同步映射中仍然可以正常工作,因为垃圾收集器可以在任何时候直接修改弱引用,绕过同步映射包装? 我认为WeakHashMap只能在单线程模型中真正工作。

如上所述,WeakHashMap的文档https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html特别指出:;

“同步的WeakHashMap可以使用Collections.synchronizedMap方法构造”

这意味着这种技术必须与垃圾收集器的行为一起工作(除非文档是错误的!)

Cafeine是番石榴caching的stream行竞争对手。

 - 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封装在同步映射中仍然可以正常工作,因为垃圾收集器可以在任何时候直接修改弱引用,绕过同步映射包装? 我认为WeakHashMap只能在单线程模型中真正工作。