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 之间的一些随机值。任何人都可以帮助我理解这里发生的情况
它没有显示“随机值” - 它显示“10,000 到 20,000 之间的值(含)”。它必须至少为 10,000,因为正在打印的线程已将计数器递增 10,000 次;它必须最多为 10,000,因为另一个线程将最多将计数器递增10,000 次。
如果两个线程在完成所有 10,000 增量this.sharedCounter.get()后都返回,则只会显示 20,000 两次。一个线程很可能比另一个线程先完成一点——此时计数器将不会是 20,000。