Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 并发HashMap线程安全和发生在关系之前_Java_Synchronized_Java.util.concurrent_Concurrenthashmap - Fatal编程技术网

Java 并发HashMap线程安全和发生在关系之前

Java 并发HashMap线程安全和发生在关系之前,java,synchronized,java.util.concurrent,concurrenthashmap,Java,Synchronized,Java.util.concurrent,Concurrenthashmap,为ConcurrentHashMap采购javadoc,我阅读了下面关于所述集合的线程安全性的声明 发件人: 检索操作(包括get)通常不会阻塞,因此可能与更新操作重叠(包括put和remove)。检索反映了最近完成的更新操作在开始时的结果。对于聚合操作,如putAll和clear,并发检索可能只反映插入或删除某些条目 我觉得这一段自相矛盾。确切地说,语句2表示retreivals反映了最近完成的操作,而语句3几乎表示聚合函数不能保证这种行为 这是否意味着像putAll和clear这样的聚合操作

ConcurrentHashMap
采购javadoc,我阅读了下面关于所述集合的线程安全性的声明

发件人:

检索操作(包括get)通常不会阻塞,因此可能与更新操作重叠(包括
put
remove
)。检索反映了最近完成的更新操作在开始时的结果。对于聚合操作,如
putAll
clear
,并发检索可能只反映插入或删除某些条目

我觉得这一段自相矛盾。确切地说,语句2表示retreivals反映了最近完成的操作,而语句3几乎表示聚合函数不能保证这种行为

这是否意味着像
putAll
clear
这样的聚合操作仍然是一种风险赌注

这是否意味着像putAll和clear这样的聚合操作仍然是一种风险赌注

他们承诺“检索操作…不要阻止”对他们可以承诺的其他内容设置了一些主要限制。例如,一个
map.get(k)
调用必须立即返回
null
或先前
put(k,v)
具有相同
k
的一些
v
get(k)
调用不能等待其他线程完成
map.putAll(somenormousothermap)
调用。他们保证它不会阻塞


基本上,他们无法兑现这一承诺,除非看起来是原子操作的唯一操作是单个键/值对的插入/删除/替换。在不违背non-blocking-get()承诺的情况下实现加积门操作的唯一方法是将它们实现为一次对一个键/值对进行操作的原子原语的非原子调用序列。

ConcurrentHashMap
是(大部分)非阻塞收集类型之一。在更新地图内容时,它只锁定地图的一部分,方法是保留几个不同的锁。这并不能保证特定方法之后的同步。它保证您不会覆盖数据或损坏集合。如果您需要始终向您提供其数据最新视图的集合,请切换到
Collections.synchronizedMap
,它将锁定同步块中的每个操作。这还有其他含义,例如当大量线程更新或查询映射时发生锁争用