我有一个在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 ??。
答案 0 :(得分:2)
无论您是否使用相同的密钥,HashMap
对于任何写作都不是线程安全的:
请注意,此实现未同步。如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)
即使涉及不同的密钥,同时两个操作也可能触发内部地图扩展,从而导致问题。 (或者即使有一个写操作和一个读操作,如果写操作添加或删除一个键,也可能会导致读取操作。)
选项:
Collections.synchronizedMap
)ConcurrentHashMap
)编辑:如果事实证明你没有有多个线程同时修改地图(因为每个用户有一个地图),那么大部分问题都会消失......虽然如果仍然有多个线程访问地图(只是不是同时),我总是试图使用并行映射 以避免陈旧读取等问题。
答案 1 :(得分:0)
你的问题不是很清楚。但是,只要多个线程访问非线程安全的集合,并且其中至少有一个写入集合,那么您需要正确的同步,并且所有必须同步对映射的访问。
答案 2 :(得分:0)
同意Jon Skeet “如果涉及不同的密钥,同时两个操作都可能触发内部地图扩展,从而导致问题”
但是可以有特定的场景,因为“ HashMap仅在应用程序开始时填充数据连接参数等数据,之后我们只从中获取数据”然后为每个线程选择操作将返回相同的值。
在Jon Skeet提到的所有其他场景中,您有以下选项 1)使用同步集合(例如Collections.synchronizedMap) 2)使用并发集合(例如ConcurrentHashMap) 3)自己同步所有访问