• 关于i++引出的线程不安全性的分析以及解决措施


    Q:i++是线程安全的吗?

    A:如果是局部变量,那么i++是线程安全。

         如果是全局变量,那么i++不是线程安全的。

    理由:如果是局部变量,那么i++是线程安全:局部变量其他线程访问不到,所以根本不存在是否安全这个问题。

        如果是全局变量,那么i++不是线程安全的:当它是全局变量时,所有线程都可以访问,那么,当有1000个线程同时执行i++操作时,i变量的副本拷贝到每个线程的线程栈,当同时有两个线程以上的线程读取线程变量,比如此时是5,那么同时执行i++操作,再写入到全局变量,最后,两个线程跑完了,这个i还是6,而并不会是7,所以,出现不安全性。

      从更底层的角度讲,主要是因为i++这个操作不是原子性的,这个会编译成count = count +1; 所以会出现多线程访问冲突问题。volatile虽然可以保证多线程对修改可见,但代码中用到了
    count++, 主要是count++不是原子性操作,这个会编译成count = count +1,其实是做了3个步骤,一个是读取,修改,写入 。所以会出现多线程访问冲突问题

    总而言之,如果操作是原子性的,也就是说转为汇编语句是一句,不可分割的,那么无论怎样都是线程安全的,否则,不管加没加volatile,都是线程不安全的!

    解决方案:i前面加上AtomicInteger

  • 相关阅读:
    windows环境变量
    软件工程的一般过程和需要的文档
    linux find 命令查找文件和文件夹
    mybatis中mapUnderscoreToCamelCase自动驼峰命名转换
    人体湿气重有哪些表现? 细数湿气重的危害
    MySQL升级后1728错误解决方案
    linux清理Java环境
    无线投屏PC投电视
    report studio 交叉表占比
    Cognos审核模块的导入与设置
  • 原文地址:https://www.cnblogs.com/yzjT-mac/p/6249654.html
Copyright © 2020-2023  润新知