i++这种操作并不是原子性的, 实际上它的操作是首先从内存中取出数据放在cpu寄存器中进行计算, 然后再将计算好的结果返回到内存中。
转载:https://blog.youkuaiyun.com/qq_41594146/article/details/87433065
可能的结果:最小为2,最大为200
最小为2线程执行过程
A线程和B线程都是第一次执行i++,cpu1和cpu2寄存器中的值为1(不写回内存),内存中的值为0
当A线程的i++执行到99次时,此时cpu1寄存器中值为99,内存为99
当B线程cpu2寄存器的1,写回内存覆盖内存的99,变成1
如果可以这样,那A线程也可以同样再覆盖一次B线程,最终结果就是2
若是i--执行100次,结果范围就是0到98了。
实验验证:
public class Test {
private static int i = 0;
public static void main(String[] args) {
Runnable runnable = () -> {
for (int j = 0; j < 100; j++) {
i++;
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(i);
};
new Thread(runnable).start();
new Thread(runnable).start();
}
}