我有一个场景,其中未知数量的线程将元素添加到服务器上的集合。此集合中的数据不必排序,也不会迭代。只有两个简单的操作适用于此集合:
哪个系列适用于此用例?我会选择ConcurrentHashMap,我不知道这个选择是否合适。
编辑:我忘记了一个重要的要求:如果某个元素已经存在于此集合中,并且添加了另一个相同类型的元素,则在添加新元素之前应删除旧元素。对于此要求,我想使用哈希值来避免搜索。存储的对象很简单:它们包含唯一的用户名和一些字符串和整数。对象的用户名应该用作密钥。
答案 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)时间。