Java 用于<;关键、价值>;一对
我需要一个包含[key,Value]对的容器 这里,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=Integer,Value=User-Defined类对象
多个线程正试图在上述容器中添加[key,Value]对
如果密钥已经存在于容器中,我想通过检查一些条件来更新该值
最后,我希望容器按照键的顺序排序
我的努力-
我用这个和上面的任务
SortedMap<Integer, USER_DEFINED_OBJECT> m = Collections.synchronizedSortedMap(new TreeMap<Integer, USER_DEFINED_OBJECT>());
SortedMap m=Collections.synchronizedSortedMap(新树映射());
这有助于我在上述容器上同时添加对
是的,如果钥匙已经存在,那么我检查一些条件,然后继续
我的方法总是线程安全的吗?如果没有,请纠正我
已更新
使用java.util包中的ConcurrentHashMap,阅读API 可扩展的并发ConcurrentNavigableMap实现。映射根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于使用的构造函数。 此类实现了SkipList的并发变体,为containsKey、get、put和remove操作及其变体提供了预期的平均日志(n)时间开销。插入、删除、更新和访问操作由多个线程同时安全执行。迭代器是弱一致的,返回的元素反映了迭代器创建时或创建之后某个点的映射状态。它们不会抛出ConcurrentModificationException,并且可以与其他操作同时进行。升序键顺序视图及其迭代器比降序键顺序视图及其迭代器快
并发集合允许您在某种事务中调用方法,如
put
、remove
等。因此它是线程安全的
据我所知,您添加新[key,value]
对的场景如下:
值
我怀疑是否有一个实现可以以线程安全的方式为您实现这一点。在我正确理解您的用例的情况下,您需要自己添加一些手动同步,以使更新步骤具有事务性 只要您同步整个“添加、更新”过程,而不仅仅是添加过程,这应该是线程安全的。
ConcurrentHashMap
是解决方案,然后按照所需顺序对其进行排序。看看你的代码是否是线程安全的,请提供它的其余部分。特别是检查条件。你们可能有竞争条件。@ChrisK请检查更新的部分。但哈希映射不会以排序方式给我输出。@Loha:是的,对,我的错。那么TreeMap就是一条出路。谢谢你的回答。但有一点我很困惑,是的,我们可以同时添加多个条目。但是添加任何我需要检查的条目,无论该条目是否已经存在。我想可能有一种情况,当一个线程检查的条件,它发现对不存在的容器,去把。但与此同时,另一个线程为该键输入了som值。这种情况曾经发生过吗?它取决于应用程序的逻辑。如果需要,您应该检查::-。这种情况可能会发生。这个类只有在不存在的情况下才有方法putIfAbsent-addpair。是的,确切地说,我通过在容器对象上放入synchronized块来设置检查条件并将容器更新为原子。