何必要如此
2021-02-23 16:33
采纳率: 66.7%
浏览 99
已采纳

加了volatile 为什么结果不对?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 穿白衬衣的少年 2021-02-23 16:38
    已采纳

    volatile 的作用是保证可见性和禁止对其进行指令重排序,但是不保证原子性,i ++ 操作不是原子性的

    打赏 评论
  • L-zbin 2021-02-23 16:41

    volatile关键字与线程同步没有关系的,增加了该关键字的作用是在修改变量值时直接操作内存,减少了先把变量复制一个副本进行修改后再存回内存的过程;

    线程同步需要使用 synchronized关键字对控制代码块或方法进行线程同步控制。

    打赏 评论
  • Java&Mango 2021-02-23 17:15

    volatile 的作用是保证可见性和禁止对其进行指令重排序,但是不保证原子性。如果要保证原子性建议使用AtomicInteger.

    可以将static volatile int i =1; 改成AtomicInteger atomicInteger = new AtomicInteger(0);

     

    然后i++;改成atomicInteger.getAndIncrement();

    就可以实现原子性了。

    打赏 评论
  • 纯白微风 2021-02-23 17:50

    要清楚顺序操作!=原子操作,原子操作才能保证数据在多线程环境下的安全。

    打赏 评论

相关推荐 更多相似问题