代码
/** * atomicXXX * 一道面试题:多个atomic类连续调用能否构成原子性? */ @Slf4j(topic = "test") public class Demo { AtomicInteger count = new AtomicInteger(0); public void test(){ for (int i = 0; i < 10000; i++) { if(count.get() < 1000){ //count++ count.incrementAndGet(); } } } public static void main(String[] args) { Demo demo = new Demo(); List<Thread> threads = new ArrayList(); //启动10个线程 for (int i = 0; i < 10; i++) { threads.add(new Thread(demo::test, "thread-" + i)); } //启动线程 threads.forEach((o)->o.start()); threads.forEach((o)->{ try { //等待执行 o.join(); } catch (Exception e) { e.printStackTrace(); } }); //全部执行完 后打印count log.debug(demo.count+""); } } 执行结果
17:44:41.208 [main] DEBUG test - 1003
分析原因
test方法中的,if(count.get() < 1000),这个判断并不能保证是原子性的