Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中CuncurrentSkipListMap的非线程安全方法_Java_Multithreading_Treemap - Fatal编程技术网

Java中CuncurrentSkipListMap的非线程安全方法

Java中CuncurrentSkipListMap的非线程安全方法,java,multithreading,treemap,Java,Multithreading,Treemap,在我的Java项目中,我需要以多线程的方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但是有些方法不是线程安全的。其中之一是containsKey(对象键)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会替换旧密钥的密钥,如果不可能,我将放置另一个密钥,而不会获得唯一密钥。什么构造应该使用containsKey,因为我不能丢失信息?如果您担心containsKey的结果在您采取行动之前就过时了,或者担心: 此外,不能保证以原子方式执行p

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

如果您担心containsKey的结果在您采取行动之前就过时了,或者担心:

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

您可以使用ConcurrentSkipListMap上定义的方法。例如,请参见:

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

除了动作是原子执行的


另请参见“删除和替换”方法。

你是什么意思,
containsKey
不是线程安全的?我在文档中读到该方法不是线程安全的。@ChrisK它怎么不是线程安全的?您将什么定义为线程安全?@ChrisK“插入、删除、更新和访问操作由多个线程安全地并发执行”-documentationAlex,我将尝试说明非原子的含义,设想如下:map.keySet().toArray()-您希望在调用toArray()时获得映射本身的快照,正确的?实际上,您可能获得的快照可能会受到任何线程的干扰,并且可能永远不会实际表示keySet()的状态。尽管如此,它仍然是安全的,任何突变都保证不会导致任何损坏的不变量。在这方面,containsKey是完全线程安全的。如果CSLM是这项工作的合适工具,那就另当别论了。在我的程序中,我需要一把不会取代旧钥匙的钥匙,如果不可能,我会把另一把钥匙放进去,而不会得到唯一的钥匙。用什么结构来代替containsKey?因为我不能丢失信息。
putIfAbsent
我想应该处理好这件事?如果你想把一些东西放到地图上,但不想同时覆盖一些进入地图的东西。
if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);