Java 用于<;关键、价值>;一对

Java 用于<;关键、价值>;一对,java,multithreading,treemap,Java,Multithreading,Treemap,我需要一个包含[key,Value]对的容器 这里,key=Integer,Value=User-Defined类对象 多个线程正试图在上述容器中添加[key,Value]对 如果密钥已经存在于容器中,我想通过检查一些条件来更新该值 最后,我希望容器按照键的顺序排序 我的努力- 我用这个和上面的任务 SortedMap<Integer, USER_DEFINED_OBJECT> m = Collections.synchronizedSortedMap(new TreeMap<

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

这里,
key=Integer,Value=User-Defined类对象

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

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

最后,我希望容器按照键的顺序排序

我的努力-

我用这个和上面的任务

SortedMap<Integer, USER_DEFINED_OBJECT> m = Collections.synchronizedSortedMap(new TreeMap<Integer, USER_DEFINED_OBJECT>());
SortedMap m=Collections.synchronizedSortedMap(新树映射());
这有助于我在上述容器上同时添加对

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

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

已更新

  • 用户定义的对象有一些字段索引
  • 在添加时,我正在检查键是否已经存在,然后根据上述(第1点)字段“索引”比较当前用户定义的对象与已经存在的用户定义的对象。如果当前“索引”大于更新

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

    可扩展的并发ConcurrentNavigableMap实现。映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数。 此类实现了SkipList的并发变体,为containsKey、get、put和remove操作及其变体提供了预期的平均日志(n)时间开销。插入、删除、更新和访问操作由多个线程同时安全执行。迭代器是弱一致的,返回的元素反映了迭代器创建时或创建之后某个点的映射状态。它们不会抛出ConcurrentModificationException,并且可以与其他操作同时进行。升序键顺序视图及其迭代器比降序键顺序视图及其迭代器快


    并发集合允许您在某种事务中调用方法,如
    put
    remove
    等。因此它是线程安全的

    据我所知,您添加新
    [key,value]
    对的场景如下:

  • 检查映射是否已存在
  • 如果没有,就添加它
  • 如果是,则根据一些检查更新映射中现有的

  • 我怀疑是否有一个实现可以以线程安全的方式为您实现这一点。在我正确理解您的用例的情况下,您需要自己添加一些手动同步,以使更新步骤具有事务性

    只要您同步整个“添加、更新”过程,而不仅仅是添加过程,这应该是线程安全的。
    ConcurrentHashMap
    是解决方案,然后按照所需顺序对其进行排序。看看你的代码是否是线程安全的,请提供它的其余部分。特别是检查条件。你们可能有竞争条件。@ChrisK请检查更新的部分。但哈希映射不会以排序方式给我输出。@Loha:是的,对,我的错。那么TreeMap就是一条出路。谢谢你的回答。但有一点我很困惑,是的,我们可以同时添加多个条目。但是添加任何我需要检查的条目,无论该条目是否已经存在。我想可能有一种情况,当一个线程检查的条件,它发现对不存在的容器,去把。但与此同时,另一个线程为该键输入了som值。这种情况曾经发生过吗?它取决于应用程序的逻辑。如果需要,您应该检查::-。这种情况可能会发生。这个类只有在不存在的情况下才有方法putIfAbsent-addpair。是的,确切地说,我通过在容器对象上放入synchronized块来设置检查条件并将容器更新为原子。