使用i++,内存中主要流程:
- 把i的数值,从内存读入寄存器。(寄存器在CPU上)
- 寄存器将数值+1。
- 将寄存器的值写回内存。
测试代码:
public class IPPTest {
private static int a=0;
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
new Thread(()->{
a++;
}).start();
}
System.out.println(a);
}
}
测试结果:
解决方法:
-
添加synchronized关键字, 让操作方法变为同步
不推荐, 因为这样虽然提高了安全性, 但是并发性能大大降低
-
使用atomicInteger类
其底层主要运用了unsafe类和cas思想(循环比较并替换).