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 如何添加编译参数
https://www.ossez.com/t/sun-misc-contended-cannot-find-symbol/13758
Comments