WeakHashMap是否有java.util.concurrent等价物?

时间:2010-02-13 00:16:36

标签: java collections guava java.util.concurrent weakhashmap

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

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

即。有什么来自java.util.concurrent可以使用吗?请注意,仅用

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

显然不起作用

6 个答案:

答案 0 :(得分:36)

GuavaCacheBuilder课程可让您轻松完成此任务。

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

请注意,这会将键等同语义更改为==而不是.equals(),这在您使用Class实例的情况下无关紧要,但这是一个潜在的陷阱。

答案 1 :(得分:19)

我不相信有。事实上,javadoc建议使用Collections.synchronizedMap()

“与大多数集合类一样,此类不同步。可以使用Collections.synchronizedMap方法构建同步的WeakHashMap。”

答案 2 :(得分:1)

Cafeine是Guava缓存的热门竞争对手。

- 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));

答案 3 :(得分:0)

  

将WeakHashMap包装在同步映射中是否仍然有效   正确的你想做什么,因为垃圾收集器可以   直接在任何时候修改弱引用,绕过   同步地图包装?我认为WeakHashMap只能真正起作用   单线程模型。

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

  

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

这对我来说意味着这种技术必须与垃圾收集器的行为协同工作(除非文档有问题!)

答案 4 :(得分:0)

如果您使用的是Java 7及更高版本,则使用SET heading OFF select (case when usable_file_mb < 40000 then 'echo -e "\033[41m' else 'echo -e "\033[40m' end)|| name||' '|| state||' '|| total_mb||' '|| usable_file_mb || '\033[m"' from v$asm_diskgroup https://docs.oracle.com/javase/7/docs/api/java/lang/ClassValue.html以线程安全的方式解决此用例如果您需要使用ClassValue,请仔细考虑并发性并仔细阅读文档。

如果您使用的是Java 6或更低版本。不,你必须同步一个WeakHashMap。

答案 5 :(得分:-1)

将WeakHashMap包装在同步映射中是否仍能正常运行您想要执行的操作,因为垃圾收集器可以随时直接修改弱引用,绕过同步映射包装器?我认为WeakHashMap只能在单线程模型中使用。