有没有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只能在单线程模型中真正工作。