使用原子整数的共享计数器并发增量

Mau*_*umi 4 java concurrency multithreading race-condition atomicinteger

嗨,我是多线程新手。试图理解原子整数的概念。我有一个共享计数器变量,它由两个线程递增

class MyCounterClass{
    volatile AtomicInteger sharedCounter = new AtomicInteger(0);

    public int incrementCounter() {
        for(int i = 0; i <10000; i++){
            // add 1
            sharedCounter.incrementAndGet();
        }

        return this.sharedCounter.get();
    }
}

public static void main(String[] args) throws InterruptedException {
        MyCounterClass myCounterClassObj = new MyCounterClass();
        Thread t1 = new Thread(() -> {
            System.out.println("Thread " + Thread.currentThread().getName() + " " +myCounterClassObj.incrementCounter());
        });

        Thread t2 = new Thread(() -> {
            System.out.println("Thread " + Thread.currentThread().getName()+ " " + myCounterClassObj.incrementCounter());
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();
    }
}
Run Code Online (Sandbox Code Playgroud)

我以为 2 个线程的输出将为 20000。但是我得到 20000 作为一个线程的输出,而另一个线程显示 10000 到 20000 之间的一些随机值。任何人都可以帮助我理解这里发生的情况

在此输入图像描述

Jon*_*eet 5

它没有显示“随机值” - 它显示“10,000 到 20,000 之间的值(含)”。它必须至少为 10,000,因为正在打印的线程已将计数器递增 10,000 次;它必须最多为 10,000,因为另一个线程将最多将计数器递增10,000 次。

如果两个线程在完成所有 10,000 增量this.sharedCounter.get()返回,则只会显示 20,000 两次。一个线程很可能比另一个线程先完成一点——此时计数器将不会是 20,000。