关于volatile和Atomic类的一些疑问?

 Wei-Micro_788 发布于 2023-02-13 17:18

我将通过Java线程书.我发现了这个说法

声明1: - "volatile变量只能安全地用于单个加载或存储操作,不能应用于long或double变量.这些限制使得volatile变量的使用不常见"

我没有得到单个加载或存储操作在这里意味着什么?为什么挥发性不能应用于长或双变量?

声明2: - "易失性整数不能与++运算符一起使用,因为++运算符包含多个指令.AtomicInteger类有一个方法允许它保持的整数以原子方式递增."

为什么易失整数不能与++运算符一起使用以及AtomicInteger如何解决它?

1 个回答
  • 声明1: - "volatile变量只能安全地用于单个加载或存储操作,不能应用于long或double变量.这些限制使得volatile变量的使用不常见"

    什么?!我认为这完全是错误的.也许你的书已经过时了.

    声明2: - "易失性整数不能与++运算符一起使用,因为++运算符包含多个指令.AtomicInteger类有一个方法允许它保持的整数以原子方式递增."

    究竟是什么意思.++运算符实际上转换为像这样的机器代码(在类似Java的伪代码中):

    sync_CPU_caches();
    int processorRegister = variable;
    processorRegister = processorRegister + 1;
    variable = processorRegister;
    sync_CPU_caches();
    

    这不是线程安全的,因为即使它有内存屏障,并以原子方式读取,并以原子方式写入,也不能保证您不会在中间获得线程切换,并且处理器寄存器是CPU核心的本地(把它们想象成CPU核心内部的"局部变量").但它AtomicInteger是线程安全的 - 它可能是使用特殊的机器代码指令实现的,例如比较和交换.

    2023-02-13 17:20 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有