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

Java同步问题:为何以Integer变量为锁时线程同步失效?

问题原因解析
  • 锁的对象被动态替换,导致同步失效
    Java中的Integer是不可变类型,counter++这个操作看起来简单,实际底层会做三件事:

    1. 取出当前counter的数值
    2. 对数值执行加1操作
    3. 把新数值包装成全新的Integer对象,再赋值给counter变量

    这就意味着,每次执行递增后,counter指向的对象都变了。

  • 同步逻辑的漏洞
    当线程A进入synchronized (counter)代码块时,它锁定的是当时counter指向的旧对象(比如初始值0对应的Integer实例)。但A执行完counter++后,counter已经指向了新的对象。后续线程B进来时,锁定的是这个新对象,和A锁的不是同一个实例——相当于多个线程各锁各的门,完全起不到互斥的作用,自然会出现线程干扰,导致最终的counter值达不到200。

  • 用static Object锁正常的原因
    因为lock变量指向的对象从程序运行到结束都不会改变,所有线程都锁定同一个对象,确保同一时间只有一个线程能执行递增操作,同步逻辑自然生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:09