volatile修饰复合操作安全吗
不安全。java中的volatile关键字只能保证变量的可见性和禁止指令重排序,但不具备原子性。对于像i++、count += 1或“读取-修改-写入”这类复合操作,多个线程同时执行时仍会发生数据竞争,导致最终结果与预期不符。

为什么i++在多线程下会出错
因为i++在字节码层面被分解为三个步骤:从主内存加载变量值到工作内存、在寄存器中进行加1运算、将新值写回主内存。即使i是volatile的,这三个步骤也不是原子的。当两个线程同时读取到相同的旧值并分别加1后写回,其中一个线程的修改会被覆盖,造成计数丢失。

java.util.concurrent.atomic
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











