免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Java中Unsafe類的作用是什么

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

創新互聯主要從事網站設計制作、成都網站建設、網頁設計、企業做網站、公司建網站等業務。立足成都服務雨湖,十年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:13518219792

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類的作用是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!

本文名稱:Java中Unsafe類的作用是什么
網站鏈接:http://m.newbst.com/article34/gdsjse.html

成都網站建設公司_創新互聯,為您提供網站排名、關鍵詞優化靜態網站云服務器、定制網站、網站收錄

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站建設