具有固定大小的并发映射

时间:2014-11-05 13:28:25

标签: java multithreading concurrency java.util.concurrent concurrenthashmap

我需要一张符合以下要求的地图:

  1. 它应该是高度并发的。 put()get()remove()方法可以由多个线程同时调用。

  2. 它应该是固定大小的。如果HashMap的大小达到最大值(例如10000),则不应允许向地图添加新条目。它不能是LRU缓存,其中最旧的条目在达到最大大小时被删除。

  3. ConcurrentHashMap可能满足#1。但是,不确定如何在ConcurrentHashMap之上实现#2而不影响并发性(添加自定义put()方法,只有当大小小于最大大小时才会添加到地图,需要“同步”。这将破坏使用并发HashMap)的目的。

    请让我知道你的想法。

5 个答案:

答案 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)

要满足我对有界并发哈希图的要求,请执行以下操作:在使用前检查图的大小。