在Java中,java.lang.unsafe包中有Unsafe
类,它提供对操作的低级访问。
现在在我看来,JVM需要支持Unsafe
类中可用的所有方法,以便符合JLS,可以找到示例方法{{ 3}}
为了符合JLS,需要支持的操作Unsafe
和JVM需要支持的示例如下:
我现在的问题是:为什么我们在java。*包中找不到Unsafe
类?是否有一个特定的原因,为什么每个JVM提供程序创建自己的sun.misc.unsafe.Unsafe变体而不是为java。*包中定义的类编写实现会更好?
答案 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
时收到的强烈抗议。