Java同步问题:为何以Integer变量为锁时线程同步失效?
问题原因解析
锁的对象被动态替换,导致同步失效
Java中的Integer是不可变类型,counter++这个操作看起来简单,实际底层会做三件事:- 取出当前
counter的数值 - 对数值执行加1操作
- 把新数值包装成全新的Integer对象,再赋值给
counter变量
这就意味着,每次执行递增后,
counter指向的对象都变了。- 取出当前
同步逻辑的漏洞
当线程A进入synchronized (counter)代码块时,它锁定的是当时counter指向的旧对象(比如初始值0对应的Integer实例)。但A执行完counter++后,counter已经指向了新的对象。后续线程B进来时,锁定的是这个新对象,和A锁的不是同一个实例——相当于多个线程各锁各的门,完全起不到互斥的作用,自然会出现线程干扰,导致最终的counter值达不到200。用static Object锁正常的原因
因为lock变量指向的对象从程序运行到结束都不会改变,所有线程都锁定同一个对象,确保同一时间只有一个线程能执行递增操作,同步逻辑自然生效。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

