sun.misc.Contended 提示 cannot find symbol

Contended 在 JDK9 及其后续版本中的问题

sun.misc.Contended 是在JDK8 中引入的,为了解决填充问题。

但是大家注意,Contended注解是在包sun.misc,这意味着一般来说是不建议我们直接使用的。

虽然不建议大家使用,但是还是可以用的。

但如果你使用的是JDK9-JDK14,你会发现sun.misc.Contended没有了!

因为JDK9引入了JPMS(Java Platform Module System),它的结构跟JDK8已经完全不一样了。

经过我的研究发现,sun.misc.Contended, sun.misc.Unsafe,sun.misc.Cleaner这样的类都被移到了jdk.internal.**中,并且是默认不对外使用的。

那么有人要问了,我们换个引用的包名是不是就行了?

import jdk.internal.vm.annotation.Contended;

上面的问题就是包的路径使用不同的 JDK 已经不在路径中了。

但是,就算你使用了上面的包,你还是会遇到相关的错误:

error: package jdk.internal.vm.annotation is not visible
  @jdk.internal.vm.annotation.Contended
                  ^
  (package jdk.internal.vm.annotation is declared in module
    java.base, which does not export it to the unnamed module)

好,我们找到问题所在了,因为我们的代码并没有定义module,所以是一个默认的“unnamed” module,我们需要把java.base中的jdk.internal.vm.annotation使unnamed module可见。

要实现这个目标,我们可以在javac中添加下面的 flag:

--add-exports java.base/jdk.internal.vm.annotation=ALL-UNNAMED

有关在 IDEA 中的添加方法,请参考文章:IntelliJ IDEA 如何添加编译参数