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

1196

被折叠的 条评论
为什么被折叠?



