java - 不同的用户同时在java hashmap中选择相同的键——它是线程安全的吗?

标签 java collections

我有一个在java中工作的函数,使得HashMap将键存储为String,将值存储为ArrayList。所以我的问题是,当不同的用户同时登录并且他们尝试访问网络应用程序并选择相同的 key 时,在这种情况下 HashMap 需要同步吗?

像..当User1登录时,hashmap中的vlaue将在幕后存储,例如 map .put(A,列表1) map.put(B, List2)

当User2登录时,hashmap中的vlaue将在幕后存储,例如 map .put(A,列表3) map.put(C, List4)

所以现在如果两个用户同时登录并且 key 相同但(列表值始终不同)则需要同步此 HashMap ??。

最佳答案

无论您是否使用相同的 key ,HashMap 对于任何写入来说都不是线程安全的:

Note that this implementation is not synchronized. If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.)

即使涉及不同的按键,同时进行两个操作也可能会触发内部 map 扩展,从而导致问题。 (或者即使有一个写入操作和一个读取操作,如果写入操作添加或删除了一个键,则可能会导致读取操作失败。)

选项:

编辑:如果事实上您没有有多个线程同时修改 map (因为每个用户只有一张 map ),那么大多数问题都会消失......尽管如果仍然可能有多个线程访问 map (只是不是同时),无论如何我都会想使用并发 map 来避免陈旧读取等问题。

关于java - 不同的用户同时在java hashmap中选择相同的键——它是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22904576/

相关文章:

java - 如何在 Java 中传播异常

java - 使用 CollectionUtils 转换列表抛出 ArrayStoreException

Java 集合 - 前 n 个和后 n 个元素

c# 一个集合来保存两个arraylist

java - 具有多个连接的 JPA 条件生成器

java - 检查 Hamcrest 中的 List 是否为空

java - Jude 的代码编辑器中的自动换行?

java - 为什么我们在这里特别说 ArrayList 不是线程安全的?

collections - Kotlin 的列表缺少 "add"、 "remove"、 map 缺少 "put"等?

java - 在 System.out.println 中使用 charAt 显示整数?