不是Java中CuncurrentSkipListMap的线程安全方法

时间:2014-11-13 17:32:36

标签: java multithreading treemap

在我的Java项目中,我需要以多线程的方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但有些方法不是线程安全的。其中之一 - containsKey(对象键)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会取代旧的密钥,如果不可能,我将放入另一个密钥而不会获得唯一密钥。应该使用什么构造包含Key,因为我不能丢失信息?

1 个答案:

答案 0 :(得分:3)

如果你担心containsKey结果在你可以采取行动之前变得陈旧,或者关于this warning in the javadoc

  

此外,批量操作putAll,equals,toArray,containsValue和clear不保证以原子方式执行。例如,与putAll操作同时运行的迭代器可能只查看一些添加的元素。

在ConcurrentSkipListMap上定义了一些方法,您可以使用它们。例如,请参阅putIfAbsent

  

如果指定的键尚未与值关联,请将其与给定值相关联。这相当于

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);
  

除了动作以原子方式执行。

另请参阅删除和替换方法。