You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java HashSet的add方法是否线程安全?其原子性如何?

Java HashSet的add方法原子性问题

核心结论

HashSet的add方法不具备原子性,在多线程环境下,检查元素是否存在与实际添加元素的操作之间可能被中断,无法保证两个操作连续执行。

具体原因

HashSet底层依赖HashMap实现,add方法本质是调用HashMap的put方法——将待添加元素作为key,一个固定的空Object作为value。其执行逻辑大致分为两步:

  1. 检查集合中是否已存在该元素(对应HashMap中检查key是否存在)
  2. 若不存在则添加元素,返回true;若已存在则返回false

这两个步骤没有被任何同步机制包裹,属于非原子操作。在多线程场景下,线程A执行完第一步检查(发现元素不存在)后,可能被线程B抢占CPU资源,线程B此时执行同样的检查并成功添加元素;当线程A重新获得执行权时,会继续执行添加操作,但此时元素已经存在,最终add方法返回false,甚至可能因为HashMap的非线程安全特性,导致集合内部结构损坏(如链表成环、数据丢失等)。

示例场景

假设两个线程同时调用hashSet.add("test"):

  • 线程1:检查"test"不存在 → 被线程2打断
  • 线程2:检查"test"不存在 → 成功添加"test",返回true
  • 线程1:继续执行添加操作 → 发现"test"已存在,返回false

此时线程1的返回结果与预期不符,若并发操作更复杂,还可能引发HashMap的并发修改异常或结构损坏。

内容的提问来源于stack exchange,提问作者leokury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:33:27