1. 程式人生 > >unsafe(未完成,持續更新)

unsafe(未完成,持續更新)

unsafe本來的英文意思就是不安全的、危險的。在java中的角色同樣也是不安全的、危險的。它是在java包中的sun.msic,官方不建議使用,因為它能直接操作底層JVM,並且可以修改記憶體,用不好的話可能直接會導致伺服器崩潰,但是在netty、hadoop等開源框架中得到了很好的運用,例如netty中運用unsafe進行無鎖化操作。另外在java的NIO中也對unsafe有很好的運用,利用unsafe在記憶體中和直接開闢大塊的堆外記憶體進行快取和通訊,但是如果你操作不當很容易引起問題,因為它不在jvm中,所以沒有邊界檢查這一項。

1.unsafe是單例的,全域性唯一,通過原始碼我們就能明白

這裡也可以看到,只有主類載入器載入的類才能得到unsafe例項,普通呼叫就會拋SecurityException異常。

2.要想用unsafe,首先得獲取到unsafe例項,怎麼獲取到這個例項呢,網上的方法有很多,我習慣用反射,如下圖:

3.unsafe的功效

3.1物件例項化

據我所知大家知道的物件例項化通常是用new 或者 反射,在這裡用unsafe去建立物件例項,具體如何建立如下圖

這裡通過unsafe造一個例項,這樣在建立的過程中跳過建構函式,在有跳過建構函式的需求的話可以考慮用unsafe。

3.2修改jvm記憶體

這裡可以到jvm中找到某一欄位在jvm記憶體中的實體地址,然後進行替換,具體操作如下圖