我将通过Java线程书.我发现了这个说法
声明1: - "volatile变量只能安全地用于单个加载或存储操作,不能应用于long或double变量.这些限制使得volatile变量的使用不常见"
我没有得到单个加载或存储操作在这里意味着什么?为什么挥发性不能应用于长或双变量?
声明2: - "易失性整数不能与++运算符一起使用,因为++运算符包含多个指令.AtomicInteger类有一个方法允许它保持的整数以原子方式递增."
为什么易失整数不能与++运算符一起使用以及AtomicInteger如何解决它?
声明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
是线程安全的 - 它可能是使用特殊的机器代码指令实现的,例如比较和交换.