Я взял этот код из учебника по атомике, он гласил: -
"Используя AtomicInteger в качестве замены Integer, мы можем увеличивать число одновременно в поточно-ориентированном поместье без синхронизации доступа к переменной. Метод incrementAndGet () является атомарной операцией, поэтому мы можем безопасно вызывать этот метод из нескольких потоки."
Он сказал, что это вернет правильный результат, 1000, однако ни один экземпляр не достигает 1000, они обычно значительно меньше, например.
test1 result = 532
test2 result = 128
Что случилось ?
public class AtomicsTest {
public static void main(String... args){
AtomicsTest test = new AtomicsTest();
test.test1();
test.test2();
}
public void test1() {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newSingleThreadExecutor();
IntStream.range(0,1000).forEach(i->executor.submit( atomicInt::incrementAndGet ));
System.out.println("test1 result = "+ atomicInt.get());
executor.shutdown();
}
public void test2() {
AtomicInteger atomicInt = new AtomicInteger(0);
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0,1000).forEach(i->executor.submit( atomicInt::incrementAndGet ));
System.out.println("test2 result = " + atomicInt.get());
executor.shutdown();
}
}