是否可以使用Collections.synchronizedMap()
重写以下代码而不保持并发性的正确性?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
即。有什么来自java.util.concurrent可以使用吗?请注意,仅用
替换new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
显然不起作用
答案 0 :(得分:36)
Guava的CacheBuilder课程可让您轻松完成此任务。
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只能在单线程模型中使用。