我需要一张符合以下要求的地图:
它应该是高度并发的。 put()
,get()
和remove()
方法可以由多个线程同时调用。
它应该是固定大小的。如果HashMap
的大小达到最大值(例如10000),则不应允许向地图添加新条目。它不能是LRU缓存,其中最旧的条目在达到最大大小时被删除。
ConcurrentHashMap
可能满足#1。但是,不确定如何在ConcurrentHashMap
之上实现#2而不影响并发性(添加自定义put()
方法,只有当大小小于最大大小时才会添加到地图,需要“同步”。这将破坏使用并发HashMap
)的目的。
请让我知道你的想法。
答案 0 :(得分:6)
您可以使用计数信号量来实现委托给ConcurrentHashMap的映射,以限制映射中的项目数。 Semaphore类使用原子更新的int来跟踪许可,因此不会产生额外的开销。
答案 1 :(得分:2)
你可以自己做所有这些,而单独的java SE工具库可能会提供你所需要的东西,但我强烈建议使用更简单,更具可扩展性的方法,因为自己完成所有这些工作将会重新发明轮子。在内存数据网格中尝试其中一种:
例如,在ehcache中,您可以通过类似于:
的配置实现您的目标<cache
name="myCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="false" />
答案 2 :(得分:1)
如何始终保持Hashmap的大小以确保插入的元素总数?您可以使用AtomicInteger,这样就不必同步/锁定常规int并牺牲使用ConcurrentHashMap的好处。
答案 3 :(得分:0)
如果使用ConcurrentHashMap,这是显而易见的选择,那么使用构造函数的concurrencyLevel
输入来增加带宽 - 这会将地图划分为多个区域以避免放置冲突。
答案 4 :(得分:0)
要满足我对有界并发哈希图的要求,请执行以下操作:在使用前检查图的大小。