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

M S*_*ach 3 java multithreading volatile atomicity

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

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

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

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

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

Rob*_*een 5

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

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

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

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

sync_CPU_caches();
int processorRegister = variable;
processorRegister = processorRegister + 1;
variable = processorRegister;
sync_CPU_caches();
Run Code Online (Sandbox Code Playgroud)

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