i++不是原子操作
i++ 包括有取值、修改值、存新值三个操作,不具备原子性。
eg:
public class Demo { private static int num = 0; public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { num++; } }; for (int i = 0; i < 10000; i++) { new Thread(runnable).start(); } Thread.sleep(1000);//为了等子线程全部运行结束 System.out.println(num); } }
结论:该段代码结果将不会是num=10000,不同人可能得出不同的结果(我的是9996),因为可能两个线程分别进行取值操作(都取到如num=500),都进行加1,先后写值,结果两个加1实际写入num的只有一次加1。

浙公网安备 33010602011771号