java - 同时修改 HashMap 的条目是否安全...如果映射的大小是固定的并且条目是链表?

标签 java concurrency linked-list hashmap

我目前有一个固定大小的链表 HashMap,我想知道通过调用 get() 然后修改该链表的内容(添加/减去)来修改两个不同键的值是否安全节点和东西)?我知道由于可能的调整大小问题,同时修改不同的键是不安全的,但是 1) hashmap 的大小是固定的并且链表都是从头开始初始化的(作为空列表)和 2) 我怀疑在这种情况下,HashMap 会存储指向链表的指针,因此修改列表实际上不会修改 HashMap 的内容,但我不能确定。

有没有更熟悉 Java 的人能够回答这个问题?我一开始没有使用线程安全数据结构的原因是因为我的项目规范禁止它。谢谢!

最佳答案

这应该没问题,因为 map 实际上是只读的。您可能希望在使用 Collections.unmodifiableMap 初始化它时强制执行此操作或 Guava 的 ImmutableMap .

但链表是另一回事,除非您可以保证单线程访问每个单独的列表。如果没有,一个快速的解决方案是使用 Collections.synchronizedList 包装每个列表在创建时。或者你可以看看使用 ConcurrentLinkedQueue s 代替。

关于java - 同时修改 HashMap 的条目是否安全...如果映射的大小是固定的并且条目是链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16290547/

相关文章:

java - java中的通用迭代器实现

c++ - 如何正确使用 std::condition_variable?

c - 链表中的字符串相互重叠 C

c - 链表,一个元素丢失

java - 读写套接字,Java

java - 如何在 native C++ win32 应用程序中托管 JVM?

java - java中如何将字符串值转换为二进制值

multithreading - std::this_thread::yield()用法?

java - 为什么 C++/Java 内存模型不包含条件变量

c - 任务系统问题 - 任务将运行两次(重新发布一次)