在Java内存模型中重新排序

时间:2014-04-28 09:14:08

标签: java multithreading jvm

重新阅读JMM,发现有一句话我不明白:

  

我们在这里只考虑可读写的变量   原子单位 - 即没有位字段,未对齐访问或访问   大于平台上可用的字大小。

任何人都可以解释上面显示的单词粗体的情况。

1 个答案:

答案 0 :(得分:2)

在某些体系结构中,处理器可以在单个命令中执行多个内存访问:

  • 位字段:设置存储器的某些位;这通常使用read-modify-write实现,具有单独的读写访问。
  • 未对齐访问:在某些CPU体系结构中,处理器对访问多字节值时可以使用的地址施加约束,尤其是跨越字边界时。大多数现代处理器没有这个问题,因为它们可以执行多次读取以覆盖所需的地址范围;如果从0x01读取到0x05,则会将其拆分为0x01-0x04和0x05读取。如果你需要在那里写,这就复杂了;与对齐的地址(地址是4的倍数)相比,相同的区域将首先被读取,然后写入,执行所需的3倍的内存操作。 (请记住,在现代CPU上,问题更复杂,因为您有一个非常深的内存层次结构,具有不同的每层对齐约束)。

在这些情况下,操作需要跨越多个内存访问,因此有可能出现竞争条件,因此没有原子性保证。