灾难将至,java 9中将移除 <code>sun.misc.unsafe</code>
netty hazelcast cassandra mockito / easymock / jmock / powermock scala specs spock robolectric grails neo4j spring framework akka apache kafka apache wink apache storm apache hadoop apache continuum
… 这个列表很长。。。
恕我直言 — <code>sun.misc.unsafe</code> 必须死掉。 它是“不安全”的。它必须被废弃。请忽略一切理论上(想象中的)羁绊,从此走上正确的道路吧。
这个工程师似乎是毫无根据的憎恨 unsafe。。。
当前unsafe 类是一个强有力的工具。 没有必要去掉它。对这个类的特性有些明确的需求,这就是为什么事实上几乎每个 java 程序都在使用它,不知不觉中许多流行的 java库也在使用它。
除了 <code>unsafe</code> 文档外,oracle 应该发布一个更易用的 api,提供 <code>unsafe</code> 相同的功能。 这是上面文档中的提议的一部分。然而这不太应该以移除 <code>unsafe</code> 为代价。 人们在开发新软件的时候就会逐步过渡到新的 api,<code>unsafe</code> 就自动被废弃了。
这类似于向 java 8引入 <code>java.time</code> 包中的新的 <code>datetime</code> api。 新的日期 api 的引入并不表示之前的<code>datetime</code> api 被彻底移除或者隐藏到某个特殊 jvm flag 里。那样也肯定会引发一些事故。
根据事情的发展趋势,oracle 看起来会:
在 java 9正常模式下移除 <code>unsafe</code> 类。 仅在必须的情况下通过向 jvm 传递一个特殊的 flag 启动 <code>unsafe</code>
不仅类似 cassandra 或zookeeper 等基础软件,几乎所有的 java 程序,包括 web 应用也会挂掉,因为他们使用的基础库可能在底层使用了 <code>unsafe</code>。
从此打开 unsafe flag 将会成为启动 jvm 的默认 flag 之一,因为如果不打开它的话 java 应用会在毫无提示的情况下崩溃。
因为大多数环境不会默认把这个jvm flag 打开,当他们的系统升级 java时软件系统会挂掉。 java 打破了向后兼容的承诺。所有的基础库、软件基础设施从此变为两个版本:
java 9之前的版本 – 使用 <code>unsafe</code>
java 9兼容 – 不使用 <code>unsafe</code>。
迁移至 java 9的进程会因此而变缓慢,这将影响整个 java 生态系统。这将会类似于 python 2升级到 python 3的过程。
现在是该让大家开始意识到这个问题的时候了。从 jvm中去掉<code>unsafe</code>或者把它隐藏在某个特殊的 flag 里面势必导致一场灾难。
<a href="http://blog.dripstat.com/removal-of-sun-misc-unsafe-a-disaster-in-the-making/">原文</a>
<a href="http://www.infoq.com/cn/news/2015/08/oracle-plan-remove-unsafe">infoq 报道</a>
<a href="http://www.itupup.com/?it08/523957.htm">itupup 报道</a>