使用哪个并发集合?

时间:2013-06-08 15:51:20

标签: java collections concurrency

我有一个场景,其中未知数量的线程将元素添加到服务器上的集合。此集合中的数据不必排序,也不会迭代。只有两个简单的操作适用于此集合:

  1. 添加元素(在某些情况下删除旧元素)
  2. 读取集合中的所有元素(不是一个一个,而是整个集合,以便将其序列化并发送给客户端。当然,元素也可以移动到另一个集合,然后在之后序列化。)< / LI>

    哪个系列适用于此用例?我会选择ConcurrentHashMap,我不知道这个选择是否合适。

    编辑:我忘记了一个重要的要求:如果某个元素已经存在于此集合中,并且添加了另一个相同类型的元素,则在添加新元素之前应删除旧元素。对于此要求,我想使用哈希值来避免搜索。存储的对象很简单:它们包含唯一的用户名和一些字符串和整数。对象的用户名应该用作密钥。

4 个答案:

答案 0 :(得分:3)

是的,ConcurrentHashMap适用于此。在地图中使用用户名作为键类型(K)和关联的用户信息(“某些字符串和整数”)作为值类型(V)。使用put添加新的键值对,remove删除键值对,使用entrySet获取容器中的所有键值对(如果这是你的意思) “阅读集合中的所有元素”。

答案 1 :(得分:1)

我相信java.util.concurrent. CopyOnWriteArrayList中有一个并发列表实现,可以满足您的需求。

或者您可以使用:

 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());

答案 2 :(得分:1)

它不属于标准库,但您可以使用this concurrent doubly linked list。它的迭代器是弱一致的并且不会抛出ConcurrentModificationException,或者你可以使用toArray并循环返回的数组。

答案 3 :(得分:1)

我认为最好用的是ConcurrentSkipListSet。原因:

  

迭代器是弱一致的,返回的元素反映了   在创建时或之后的某个时刻的集合状态   迭代器。它们不会抛出ConcurrentModificationException,并且可能   与其他操作同时进行。升序有序视图   并且它们的迭代器比下降的更快。

这意味着您可以浏览整个列表并阅读所有项目,同时添加其他项目。它是完全并发的!

请注意添加项目需要O(logN)时间。