【发布时间】:2015-01-01 17:12:55
【问题描述】:
我需要一张符合以下要求的地图:
它应该是高度并发的。
put()、get()和remove()方法可以被多个线程同时调用。它应该是固定大小的。如果
HashMap的大小达到最大值(例如 10000),则不应允许向映射添加新条目。它不能是 LRU 缓存,其中最旧的条目在达到最大大小时会被删除。
ConcurrentHashMap 可能满足#1。但是,不确定如何在ConcurrentHashMap 之上实现#2 而不会影响并发性(添加一个自定义put() 方法,仅当大小小于最大大小时才会添加到地图中,需要“同步” . 这将破坏使用并发HashMap) 的目的。
请告诉我你的想法。
【问题讨论】:
-
放之前检查尺寸?
-
在 concurrenthashmap 中报告的大小不准确。也许使用带有计数信号量的concurrenthashmap?
-
“不确定如何在 ConcurrentHashMap 之上实现 #2 而不会影响并发”...我不明白为什么会出现问题。您创建一个包装器,在并发映射之上引入计数器。为了同步对计数器的访问,您使用自己的同步原语(例如,ReentrantLock)来最小化额外的开销并将其与并发映射同步分开。那么一切都应该正常工作
-
@NathanHughes 我认为您应该写一个新答案并解决问题。 +1
-
这个最大值必须有多严格?如果某些竞争条件是可以容忍的,我认为只需对所有 mutator 方法添加检查即可(尽管注意
size()不是恒定时间)。如果你真的需要一个硬上限,你将很难在不严重损害并发性的情况下强制执行——即使信号量的想法也需要同步。您能否提供更多关于您的用例的详细信息,以及为什么您认为固定大小的并发集合是正确的解决方案?这对我来说听起来像是一个 XY 问题。
标签: java multithreading concurrency java.util.concurrent concurrenthashmap