title: Unsafe函數
categories: 並發
tags: 並發Unsafe是什麼?
Java 無法直接訪問底層作業系統,而是通過本地(native)方法來訪問。不過儘管如此,JVM 還是開了一個後門,JDK 中有一個類 Unsafe,底層是使用C/C++寫的,它提供了硬體級別的原子操作。Unsafe為我們提供了訪問底層的機制,這種機制僅供java核心類庫使用,而不應該被普通用戶使用。
UnSafe的功能主要有:
Unsafe為什麼是不安全的?
因為官方不推薦使用,因為不安全,例如你使用unsafe創建一個超級大的數組,但是這個數組jvm是不管理的,只能你自己操作,容易oom,也不利於資源的回收.
Unsafe的實例怎麼獲取?
a. 在jdk8和之前如果獲得其單例對象是會拋出異常的,只能通過反射獲取,在jdk9及以後,可以通過getUnsafe靜態方法獲取
b. 我們知道 unsafe是提供給java核心內庫使用的,那麼我們如何獲取Unsafe的實例呢?當然是反射!
c. 代碼:
Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); Unsafe unsafe = (Unsafe) f.get(null);講一講Unsafe中的CAS操作?
a. JUC中用到了大量的CAS,他們的底層其實都是採用Unsafe的CAS操作,
b. CAS(比較與交換,Compare and swap)是一種有名的無鎖算法,因為不需要加鎖,性能比加鎖搞。CAS是一個CPU指令。CAS還是一個樂觀鎖技術
c. CAS存在的問題:
i. 經典的ABA問題,危害有(以棧舉例),解決方案:版本號控制,有的數據結構在高位用郵戳標記;不重複使用節點引用,而是構建新的節點,ii. CAS常常搭配自旋一起使用,如果自選長時間不成功,循環時間長 開銷大Unsafe的阻塞/喚醒操作?
a. LockSupport類中的park與unpark方法對unsafe中的park與unpark方法做了封裝,LockSupport類中有各種版本pack方法,但最終都調用了Unsafe.park()方法。
實例化類的六種方式?
a. 通過構造方法new一個對象
b. 通過Class實例一個類c. 通過發射實例化一個雷
d. 通過克隆
e. 通過反序列化
f. 通過Unsafe實例化一個類