不同的用户同时在java hashmap中选择相同的密钥---它是否是线程安全的?

时间:2014-04-07 05:55:37

标签: java collections

我有一个在java中工作的函数,以便HashMap将key存储为String,将值存储为ArrayList。所以我的问题是当不同的用户同时登录并且他们尝试访问web应用程序并且会选择相同的密钥时,需要同步哈希映射?

喜欢..当User1将在hashmap中登录vlaue时会存储在场景后面 map.put(A,List1) map.put(B,List2)

当User2登录时,hashmap中的vlaue将存储在诸如的场景之后 map.put(A,List3) map.put(C,List4)

所以现在如果两个用户同时登录并且密钥相同但是(列表值总是不同),则需要同步这个hashmap ??。

3 个答案:

答案 0 :(得分:2)

无论您是否使用相同的密钥,HashMap对于任何写作都不是线程安全的:

  

请注意,此实现未同步。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)

即使涉及不同的密钥,同时两个操作也可能触发内部地图扩展,从而导致问题。 (或者即使有一个写操作和一个读操作,如果写操作添加或删除一个键,也可能会导致读取操作。)

选项:

编辑:如果事实证明你没有有多个线程同时修改地图(因为每个用户有一个地图),那么大部分问题都会消失......虽然如果仍然有多个线程访问地图(只是不是同时),我总是试图使用并行映射 以避免陈旧读取等问题。

答案 1 :(得分:0)

你的问题不是很清楚。但是,只要多个线程访问非线程安全的集合,并且其中至少有一个写入集合,那么您需要正确的同步,并且所有必须同步对映射的访问。

答案 2 :(得分:0)

同意Jon Skeet  “如果涉及不同的密钥,同时两个操作都可能触发内部地图扩展,从而导致问题”

但是可以有特定的场景,因为“ HashMap仅在应用程序开始时填充数据连接参数等数据,之后我们只从中获取数据”然后为每个线程选择操作将返回相同的值。

在Jon Skeet提到的所有其他场景中,您有以下选项    1)使用同步集合(例如Collections.synchronizedMap)    2)使用并发集合(例如ConcurrentHashMap)    3)自己同步所有访问