沐风Cc 2020-07-27 13:52 采纳率: 100%
浏览 878
已采纳

AtomicInteger原子类,这种情况下为什么线程不安全?

AtomicInteger是原子类,线程应该是安全的,为什么这种情况下,导致了线程不安全?

class MyThread111 implements Runnable{

    AtomicInteger count = new AtomicInteger(10);

    @Override
    public void run() {
        count.decrementAndGet();
        System.out.println("线程" +Thread.currentThread().getName() + "购票成功,剩余:" + count);
    }

    public static void main(String[] args) {
        MyThread111 myThread1 = new MyThread111();
        Thread thread = new Thread(myThread1);
        Thread thread2 = new Thread(myThread1);
        Thread thread3 = new Thread(myThread1);
        thread.start();
        thread2.start();
        thread3.start();
    }
}

运行结果:

线程Thread-0购票成功,剩余:8
线程Thread-2购票成功,剩余:7
线程Thread-1购票成功,剩余:8

期望值是:

线程Thread-0购票成功,剩余:8
线程Thread-2购票成功,剩余:7
线程Thread-1购票成功,剩余:9

为什么运行的结果是线程不安全的呢? AtomicInteger是线程安全的啊

  • 写回答

2条回答 默认 最新

  • 毋丶疗 2020-07-27 14:39
    关注

    原子类的方法也都是原子性的,但是不能保证多个方法连续调用是原子性的,这里先自减再打印,结合在一起不能保证线程安全,还是要加锁或者再定义一个变量去接收自减操作后的值,再打印这个变量的值。
    比如上述状况,就是 线程0 先走了自减,还没来得及打印,线程1就进行自减操作,这时候线程0打印的时候获取的count就是 8

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答