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

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 06:39
    关注

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

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

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部