【问题标题】:sun.misc.Contended is not a member of package sun.misc Scalasun.misc.Contended 不是包 sun.misc Scala 的成员
【发布时间】:2019-02-02 12:58:14
【问题描述】:

我正在将 JDK 版本从 8 更新到 11,遇到了一些并发数据结构的问题。

error: type Contended is not a member of package sun.misc
[ERROR] @sun.misc.Contended
[ERROR]           ^
[ERROR] one error found

有没有办法解决这个问题?我正在使用 Scala 2.12.8?

【问题讨论】:

  • 你在代码中使用了这个注解吗?
  • @JornVernee 是的。为防止虚假分享...

标签: java scala java-11 java-platform-module-system


【解决方案1】:

如果您在用户代码中使用此注释,您应该删除它,因为它没有做任何事情。

Hotspot 允许在特权代码中使用此注解。来自classFileParser.cpp

AnnotationCollector::ID
AnnotationCollector::annotation_index(const ClassLoaderData* loader_data,
                                      const Symbol* name) {
  const vmSymbols::SID sid = vmSymbols::find_sid(name);
  // Privileged code can use all annotations.  Other code silently drops some.
  const bool privileged = loader_data->is_the_null_class_loader_data() ||
                          loader_data->is_platform_class_loader_data() ||
                          loader_data->is_anonymous();
  switch (sid) {
...
    case vmSymbols::VM_SYMBOL_ENUM_NAME(jdk_internal_vm_annotation_Contended_signature): {
      if (_location != _in_field && _location != _in_class) {
        break;  // only allow for fields and classes
      }
      if (!EnableContended || (RestrictContended && !privileged)) {
        break;  // honor privileges
      }
      return _jdk_internal_vm_annotation_Contended;
    }

如果注释在特权代码之外使用,通常会被忽略。


但是!似乎有一个生产级别标志可以专门为非特权类启用@Contended

在这种情况下,您可以在编译时使用--add-exports java.base/jdk.internal.vm.annotation=<your module>,并从jdk.internal.vm.annotation 导入注释。

然后在运行应用程序时使用-XX:-RestrictContended

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2021-03-31
    • 2019-09-24
    • 1970-01-01
    相关资源
    最近更新 更多