我从关于原子的教程中获取了这段代码,它说:-
“通过使用 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();
}
}