<key,value =“”> pair </key,>的线程安全容器

时间:2014-07-01 05:54:32

标签: java multithreading treemap

我需要一个包含 [key,Value] 对的容器。

此处key = Integer, Value = User Defined class object

多个线程正试图在上面的容器中添加[key,Value]对。

如果密钥已经存在于容器中,我想通过检查某些条件来更新该值。

最后,根据Key,我希望容器按排序顺序排列。

我的努力 -

我将此synchronizedSortedMapSorted Map用于上述任务。

SortedMap<Integer, USER_DEFINED_OBJECT> m = Collections.synchronizedSortedMap(new TreeMap<Integer, USER_DEFINED_OBJECT>());

这有助于我在上面的容器上同时添加对。

并且,是的如果密钥已经存在,那么我检查一些条件,然后继续。

我的方法总是线程安全吗?如果没有,请纠正我。

更新

  1. USER_DEFINED_OBJECT有一些字段索引。
  2. 在添加时,我正在检查密钥是否已经存在,然后根据上述(在第1点)提交的&#34;索引&#34;,将当前的USER_DEFINED_OBJECT与已存在的USER_DEFINED_OBJECT进行比较。如果当前&#34;索引&#34;大于更新。

3 个答案:

答案 0 :(得分:3)

使用java.util包中的ConcurrentHashMap,阅读API ConcurrentHashMap

答案 1 :(得分:3)

java.util.concurrent.ConcurrentSkipListMap

  

可伸缩的并发ConcurrentNavigableMap实现。地图根据其键的自然顺序进行排序,或者根据使用的构造函数在地图创建时提供的比较器进行排序。   此类实现SkipLists的并发变体,为containsKey,get,put和remove操作及其变体提供预期的平均log(n)时间成本。插入,删除,更新和访问操作由多个线程安全地同时执行。迭代器是弱一致的,在迭代器创建时或之后的某个时刻返回反映地图状态的元素。它们不会抛出ConcurrentModificationException,并且可能与其他操作同时进行。升序键有序视图及其迭代器比降序视图快。

答案 2 :(得分:1)

通过并发集合,您可以在事务中调用putremove等方法。因此它的线程安全。

根据我的理解,添加新[key, value]对的方案如下:

  1. 检查映射是否已存在
  2. 如果没有,只需添加
  3. 即可
  4. 如果是,请根据某些检查更新映射中的现有value
  5. 我怀疑是否存在以线程安全方式为您执行此操作的实现。在我正确理解您的用例的情况下,您需要自己添加一些手动同步以进行更新步骤 transactional