写在前面
本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定Java虚拟机
解答
假设两个线程分别访问同一对象中不同的 volatile 字段,逻辑上它们并没有共享内容,因此不需要同步。然而,如果这两个字段恰好在同一个缓存行中,那么对这些字段的写操作会导致缓存行的写回,也就造成了实质上的共享。
这就是对象字段的虚共享问题(false sharing)。
Java8引入了一个新的注释 @Contended,可以用来解决对象字段之间的虚共享问题。
补充
@Contended
Java 8引入了一个新的注释 @Contended,可以用来解决对象字段之间的虚共享问题。这个注释会影响到字段的排列。
Java 虚拟机会让不同的 @Contended 字段处于独立的缓存行中,因此你会看到大量的空间被浪费掉。
通过虚拟机选项 -XX:-RestrictContended控制。