在我的Java项目中,我需要以多线程的方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但有些方法不是线程安全的。其中之一 - containsKey(对象键)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会取代旧的密钥,如果不可能,我将放入另一个密钥而不会获得唯一密钥。应该使用什么构造包含Key,因为我不能丢失信息?
答案 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);
除了动作以原子方式执行。
另请参阅删除和替换方法。