【问题标题】:Reorderings in java memory modeljava内存模型中的重新排序
【发布时间】:2014-04-28 09:14:07
【问题描述】:
重读JMM,发现有一句话没看懂:
我们在这里只考虑可读可写的变量
原子单元 -- 即没有位域、未对齐的访问或访问
大于平台上可用的字数。
任何人都可以解释上面显示的单词是粗体的情况。
【问题讨论】:
标签:
java
multithreading
jvm
【解决方案1】:
在某些架构上,处理器可以在单个命令中执行多个内存访问:
- 位域:设置内存的某些位;这通常使用 read-modify-write 实现,具有单独的读写访问权限。
- 未对齐访问:在某些 CPU 体系结构上,处理器会对您在访问多字节值时可以使用的地址施加限制,尤其是当您跨越字边界时。大多数现代处理器没有这个问题,因为它们可以执行多次读取以覆盖所需的地址范围;如果您从 0x01 读取到 0x05,它将分为 0x01-0x04 和 0x05 读取。如果您需要在那里写,那就更复杂了;与对齐的地址(地址是 4 的倍数)相比,相同的区域将首先读取,然后写入,执行所需的内存操作次数的 3 倍。 (请记住,在现代 CPU 上,问题更为复杂,因为您的内存层次结构非常深,每层对齐约束不同)。
在这些情况下,一个操作需要跨越多个内存访问,因此可能会出现竞争条件,因此无法保证原子性。