天天看點

Java 9中将移除 Sun.misc.Unsafe

災難将至,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>