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

时间:2015-08-12 18:04:33

标签: java

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

现在在我看来,JVM需要支持Unsafe类中可用的所有方法,以便符合JLS,可以找到示例方法{{ 3}}

为了符合JLS,需要支持的操作Unsafe和JVM需要支持的示例如下:

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

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

2 个答案:

答案 0 :(得分:9)

使Unsafe部分核心API和实施JLS是不同的问题。

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

然而,他们非常清楚1)许多优秀的开发人员已成功使用它,2)许多糟糕的开发人员滥用它。因此,有一个长期计划,以安全,理智和可支持的方式通过核心Java平台公开Unsafe的有用功能。

您可以查看a presentation from Mark Reinhold,其中详细说明了Unsafe将如何迁移并最终成功。

但是,即使将Unsafe API移入某个java(或javax)包,提供程序仍将具有内部类和本机代码来实现这些API。例如,Oracle可能有类似oracle.internal.misc.StillUnsafe的内容,其中包含一堆本机方法。本课程不受JLS管辖; Oracle可以随意实现它们的喜好,并在需要时进行更改。但是,通过这种方法,他们还可以提供委托给内部类的核心Java API的实现。

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

答案 1 :(得分:3)

Java unsafe包只应该由核心Java类see here使用。 Java也不希望个人使用sun.misc.unsafe类,事实上,他们想要删除它。 Oracle wanted to discourage使用不安全的类,而limiting the class to only support trusted code.

有人建议将Unsafe添加到支持的Java类,但不是今天它如何存在。相反,Unsafe将封装在定义和使用它们的模块中。 This is a formal proposal,这是因为当Oracle表示有意删除Unsafe时收到的强烈抗议。