聊聊Unsafe的一些使用技巧
反射
這個 Java 提供的特性,盡管在現(xiàn)在看來,這是非?;A(chǔ)的知識點,但那時候無疑是興奮的,瞬間覺得自己脫離了“Java 初學(xué)者”的隊伍。隨著工作經(jīng)驗的積累,我也逐漸學(xué)習(xí)到了很多類似的讓我為之而興奮的知識點,Unsafe 的使用技巧無疑便是其中一個。sun.misc.Unsafe
是 JDK 原生提供的一個工具類,包含了很多在 Java 語言看來很 cool 的操作,例如內(nèi)存分配與回收、CAS 操作、類實例化、內(nèi)存屏障等。正如其命名一樣,由于其可以直接操作內(nèi)存,執(zhí)行底層系統(tǒng)調(diào)用,其提供的操作也是比較危險的。Unsafe 在擴展 Java 語言表達(dá)能力、便于在更高層(Java層)代碼里實現(xiàn)原本要在更低層(C層)實現(xiàn)的核心庫功能上起到了很大的作用。從 JDK9 開始,Java 模塊化設(shè)計的限制,使得非標(biāo)準(zhǔn)庫的模塊都無法訪問到 sun.misc.Unsafe
。但在 JDK8 中,我們?nèi)匀豢梢灾苯硬僮?Unsafe,再不學(xué)習(xí),后面可能就沒機會了。使用 Unsafe
Unsafe 被設(shè)計的初衷,并不是希望被一般開發(fā)者調(diào)用,所以我們不能通過 new 或者工廠方法去實例化 Unsafe 對象,通常可以采用反射的方法獲取到 Unsafe 實例:public?static?final?Unsafe?unsafe?=?getUnsafe();
static?sun.misc.Unsafe?getUnsafe()?{
????try?{
????????Field?field?=?Unsafe.class.getDeclaredField("theUnsafe");
????????field.setAccessible(true);
????????return??(Unsafe)?field.get(null);
????}?catch?(Exception?e)?{
????????throw?new?RuntimeException(e);
????}
}
拿到之后,便可以用這個全局的單例對象去為所欲為了。功能概覽

圖片來源于網(wǎng)絡(luò),我直接借用過來了。上圖包含了 Unsafe 的眾多功能,還算全面。如果全部介紹,文章篇幅會過長,形式難免會流水賬,我打算結(jié)合我的一些項目經(jīng)驗以及一些比賽經(jīng)驗,從實踐角度聊聊 Unsafe 的一些使用技巧。