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。

posted @ 2021-09-10 11:17  偶尔做不好,也没关系  阅读(237)  评论(0)    收藏  举报