91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Unsafe類的作用是什么

發布時間:2021-01-14 15:38:04 來源:億速云 閱讀:422 作者:Leah 欄目:編程語言

Java中Unsafe類的作用是什么?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Unsafe類是啥?

Java最初被設計為一種安全的受控環境。盡管如此,Java HotSpot還是包含了一個“后門”,提供了一些可以直接操控內存和線程的低層次操作。這個后門類——sun.misc.Unsafe——被JDK廣泛用于自己的包中,

一、內存管理。包括分配內存、釋放內存等。

該部分包括了allocateMemory(分配內存)、reallocateMemory(重新分配內存)、copyMemory(拷貝內存)、freeMemory(釋放內存 )、getAddress(獲取內存地址)、addressSize、pageSize、getInt(獲取內存地址指向的整數)、getIntVolatile(獲取內存地址指向的整數,并支持volatile語義)、putInt(將整數寫入指定內存地址)、putIntVolatile(將整數寫入指定內存地址,并支持volatile語義)、putOrderedInt(將整數寫入指定內存地址、有序或者有延遲的方法)等方法。getXXX和putXXX包含了各種基本類型的操作。

利用copyMemory方法,我們可以實現一個通用的對象拷貝方法,無需再對每一個對象都實現clone方法,當然這通用的方法只能做到對象淺拷貝。

二、非常規的對象實例化。

allocateInstance()方法提供了另一種創建實例的途徑。通常我們可以用new或者反射來實例化對象,使用allocateInstance()方法可以直接生成對象實例,且無需調用構造方法和其它初始化方法。

這在對象反序列化的時候會很有用,能夠重建和設置final字段,而不需要調用構造方法。

三、操作類、對象、變量。

這部分包括了staticFieldOffset(靜態域偏移)、defineClass(定義類)、defineAnonymousClass(定義匿名類)、ensureClassInitialized(確保類初始化)、objectFieldOffset(對象域偏移)等方法。

通過這些方法我們可以獲取對象的指針,通過對指針進行偏移,我們不僅可以直接修改指針指向的數據(即使它們是私有的),甚至可以找到JVM已經認定為垃圾、可以進行回收的對象。

四、數組操作。

這部分包括了arrayBaseOffset(獲取數組第一個元素的偏移地址)、arrayIndexScale(獲取數組中元素的增量地址)等方法。arrayBaseOffset與arrayIndexScale配合起來使用,就可以定位數組中每個元素在內存中的位置。

由于Java的數組最大值為Integer.MAX_VALUE,使用Unsafe類的內存分配方法可以實現超大數組。實際上這樣的數據就可以認為是C數組,因此需要注意在合適的時間釋放內存。

五、多線程同步。包括鎖機制、CAS操作等。

這部分包括了monitorEnter、tryMonitorEnter、monitorExit、compareAndSwapInt、compareAndSwap等方法。

其中monitorEnter、tryMonitorEnter、monitorExit已經被標記為deprecated,不建議使用。

Unsafe類的CAS操作可能是用的最多的,它為Java的鎖機制提供了一種新的解決辦法,比如AtomicInteger等類都是通過該方法來實現的。compareAndSwap方法是原子的,可以避免繁重的鎖機制,提高代碼效率。這是一種樂觀鎖,通常認為在大部分情況下不出現競態條件,如果操作失敗,會不斷重試直到成功。

六、掛起與恢復。

這部分包括了park、unpark等方法。

將一個線程進行掛起是通過park方法實現的,調用 park后,線程將一直阻塞直到超時或者中斷等條件出現。unpark可以終止一個掛起的線程,使其恢復正常。整個并發框架中對線程的掛起操作被封裝在 LockSupport類中,LockSupport類中有各種版本pack方法,但最終都調用了Unsafe.park()方法。

七、內存屏障。

這部分包括了loadFence、storeFence、fullFence等方法。這是在Java 8新引入的,用于定義內存屏障,避免代碼重排序。

loadFence() 表示該方法之前的所有load操作在內存屏障之前完成。同理storeFence()表示該方法之前的所有store操作在內存屏障之前完成。fullFence()表示該方法之前的所有load、store操作在內存屏障之前完成。

看完上述內容,你們掌握Java中Unsafe類的作用是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳泉市| 磐石市| 清远市| 宁乡县| 曲麻莱县| 佛坪县| 屏东县| 韩城市| 合川市| 南乐县| 海宁市| 鸡泽县| 富宁县| 屏南县| 安康市| 英德市| 商南县| 敖汉旗| 永春县| 西和县| 西城区| 泗水县| 雷波县| 深水埗区| 沁阳市| 文昌市| 贵定县| 巴马| 嘉峪关市| 承德市| 卢湾区| 调兵山市| 五河县| 天台县| 德清县| 黎城县| 新源县| 临朐县| 翁源县| 高邑县| 岑巩县|