gpt4 book ai didi

java - 在 Java 或 Google Guava 中具有弱值的简单线程安全 Java HashMap ?

转载 作者:行者123 更新时间:2023-11-30 11:17:27 27 4
gpt4 key购买 nike

我想保留一个基于 ID 的单例对象映射,只是为了确保每个人都得到相同的副本。这些对象的创建很少发生,我不希望或不需要并发映射的开销(这将在内存中保留本质上的多个映射)。但我确实需要 map 支持弱键,这样当没有人使用特定实例时,记录将从 map 中删除。

那我有什么选择呢? Guava MapMakerCacheBuilder 创建并发 map ,它们使用的内存比我需要的多得多。我不需要“并发”——我只需要线程安全。是的,我可以将并发级别设置为 1,但根据 API 文档,这只是一个提示,将来可能会完全忽略。

我可以使用 Java 集合创建一个简单的同步 HashMap 并使用 putIfAbsent(...),但这并没有给我带来弱值的好处。我可以存储弱引用,但它们不会在访问 map 时自动删除。

如果我有一个支持弱值而不是弱键的 Java WeakHashMap 版本,我可以将它包装在一个同步映射中并完成它。

我相信很久以前 Apache Commons Collections 有一个允许指定弱值的映射构建器,但我们正在使用 Guava。

有什么建议吗?请先阅读完整的问题,然后再提出我已经提到的建议。

最佳答案

我想说这是错位优化的完美示例。你是说你不需要并发,你不想为多个 map 段付出代价。但是每个这样的段只存储条目的一部分,因此增加的开销不超过每个段数百字节,或者更少。

你是说存储的对象是单例的。这意味着您只需要一个这样的 map 。目前,Guava 的缓存会创建请求数量的段,即在您的情况下是一个段(因此唯一的内存开销来自长度为一个段的数组(4 字节)和一些簿记数据(大小相似)。假设情况会变得更糟,并且您使用 concurrencyLevel(1) 获得 64 个段,您可能会损失几千字节。除非您要在 ZX Spectrum 之类的东西上运行您的应用程序,否则这真的不重要。

也许我漏掉了什么,也许你遗漏了什么。请随意澄清。

关于java - 在 Java 或 Google Guava 中具有弱值的简单线程安全 Java HashMap ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24343981/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com