i++是线程安全的吗?


/**
 * i++操作本身包含了多个步骤:
 * 加载i到内存中(CPU寄存器或者缓存中)
 * 进行加1操作
 * 保存结果回内存变量i
 * 在单线程情况下,这三步操作是原子性的,一个一个进行,不会有问题。
 * 但是在多线程情况下,如果有两个线程同时执行i++操作,可能会出现以下问题:
 * 线程A加载i到内存(假设当前i为1)
 * 线程B也加载i到内存(也是1)
 * 线程A进行加1操作,i变为2
 * 线程B也进行加1操作,i也变为2
 * 线程A保存结果2回i
 * 线程B也保存结果2回i
 * 最终i只加1,而不是理论上的2。
 */
public class Test {
    private static  int count = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for(int j=0; j<10000; j++) {
                count ++ ;
            }
        });

        Thread t2 = new Thread(() -> {
            for(int j=0; j<10000; j++) {

                count ++ ;
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(count);
    }
}

猜你喜欢

转载自blog.csdn.net/xuan__xia/article/details/134874191