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

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