災難將至,Java 9中將移除 Sun.misc.Unsafe
Oracle 正在計劃在Java 9中去掉 sun.misc.Unsafe
API。 這絕對將是一場災難,有可能會徹底破壞整個 java 生態圈。 幾乎每個使用 java開發的工具、軟件基礎設施、高性能開發庫都在底層使用了 sun.misc.Unsafe
。 下面是上面鏈接中文檔提到一個小列表:
- 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
... 這個列表很長。。。
然而, Oracle 看起來是鐵了心毫無理由的去掉它。下面是一個來自他們郵件列表的評論: n
恕我直言 —
sun.misc.Unsafe
必須死掉。 它是“不安全”的。它必須被廢棄。請忽略一切理論上(想象中的)羁絆,從此走上正確的道路吧。
這個工程師似乎是毫無根據的憎恨 Unsafe。。。
當前Unsafe 類是一個強有力的工具。 沒有必要去掉它。對這個類的特性有些明確的需求,這就是為什麼事實上幾乎每個 Java 程序都在使用它,不知不覺中許多流行的 Java庫也在使用它。
Oracle 應該接受現實,並將Unsafe轉為公開 API,提供完善的文檔和開發示例。 當前,沒有准確的文檔,開發中需要通過 stackoverflow 帖子或者其他一些隨機的博客學習怎麼使用 Unsafe
。 移除 Unsafe
的一個主要論據是:使用它太容易讓開發中犯錯了。如果有完善的官方文檔或許可以改善這一現狀。
除了 Unsafe
文檔外,Oracle 應該發布一個更易用的 API,提供 Unsafe
相同的功能。 這是上面文檔中的提議的一部分。然而這不太應該以移除 Unsafe
為代價。 人們在開發新軟件的時候就會逐步過渡到新的 API,Unsafe
就自動被廢棄了。
這類似於向 Java 8引入 java.time
包中的新的 DateTime
API。 新的日期 API 的引入並不表示之前的DateTime
API 被徹底移除或者隱藏到某個特殊 JVM flag 裡。那樣也肯定會引發一些事故。
根據事情的發展趨勢,Oracle 看起來會:
- 在 Java 9正常模式下移除
Unsafe
類。- 僅在必須的情況下通過向 JVM 傳遞一個特殊的 flag 啟動
Unsafe
Unsafe
。Unsafe
Unsafe
。你是不是任務這太荒唐了,Oracle 絕不可能犯這樣的錯誤?事實上它曾做過類似的事情了, 例如Java 7中的字節碼校驗器。
現在是該讓大家開始意識到這個問題的時候了。從 JVM中去掉Unsafe
或者把它隱藏在某個特殊的 flag 裡面勢必導致一場災難。