java - 为什么 sun.misc.unsafe.Unsafe 不在默认的 java.* 包之一中?

标签 java

在 Java 中,java.lang.unsafe 包中有 Unsafe 类,它提供对操作的低级访问。

现在在我看来,JVM 需要支持Unsafe 类中可用的所有 方法,以便与 JLS 兼容,示例方法可以是找到 here .

Unsafe 提供且 JVM 需要支持以符合 JLS 的操作示例如下:

  • 使用对象
  • 存储数据(类型为 int、long、byte 等)
  • 检索数据
  • 使用监视器
  • 使用内存栅栏
  • 等等

我现在的问题是:为什么我们在 java.* 包中找不到 Unsafe 类?每个 JVM 提供者都创建自己的 sun.misc.unsafe.Unsafe 变体而不是为 java.* 包中定义的类编写实现会更好,这是否有特定原因?

最佳答案

使 Unsafe 成为核心 API 的一部分,并实现 JLS 是不同的问题。

Unsafe 不是 Java API 的一部分,因为它不安全,并且 Oracle 不希望开发人员使用它。

但是,他们很清楚 1) 许多优秀的开发人员已经成功地使用了它,并且 2) 许多糟糕的开发人员滥用了它。因此,我们制定了一项长期计划,以安全、健全和可支持的方式通过核心 Java 平台公开 Unsafe 的有用功能。

可以查看a presentation from Mark Reinhold这更详细地解释了 Unsafe 将如何迁移并最终消失。

但是,即使将 Unsafe API 移入某些 java(或 javax)包中,提供程序仍将具有内部类和 native 代码实现这些 API。例如,Oracle 可能有类似 oracle.internal.misc.StillUnsafe 的东西,里面有一堆 native 方法。此类不受 JLS 管辖;甲骨文将可以自由地按照他们喜欢的方式实现它,并在他们喜欢的时候改变它。但是,通过这种方法,他们还将提供委托(delegate)给其内部类的核心 Java API 的实现。

java.* 包中声明 API 并不意味着 Java 运行时的作者不必提供代码来支持它;许多 Java API 是抽象的,必须由提供商提供实现。

关于java - 为什么 sun.misc.unsafe.Unsafe 不在默认的 java.* 包之一中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31972356/

相关文章:

java - JasperReports JavaBeans 设置数据源,一般错误

java - 如何为运行 Tomcat 的 Web 应用程序配置带有 logback 的 slf4j

JAVA - 如何在二维数组的行和列中查找重复值?

java - 如何在 QuickSelect 中实现重复

java - 制造商在谷歌地图上调用相同的 Activity

java - 如何使用 Spring Batch 通过 XSSFSheet XML Handler.SheetContentsHandler 指定日期格式?

java - Spring Java 配置中的 Hibernate 3 sessionFactory

java - Apache Storm 本地集群 "Unable to canonicalize address"

java - GraalVM 和 Jvm-Hotspot 的区别

Java Streams,仅过滤第一个 'N' 匹配项