日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的Unsafe

發布時間:2025/3/12 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的Unsafe 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java和C++語言的一個重要區別就是Java中我們無法直接操作一塊內存區域,不能像C++中那樣可以自己申請內存和釋放內存。Java中的Unsafe類為我們提供了類似C++手動管理內存的能力。
Unsafe類,全限定名是sun.misc.Unsafe,從名字中我們可以看出來這個類對普通程序員來說是“危險”的,一般應用開發者不會用到這個類。

Unsafe類是"final"的,不允許繼承。且構造函數是private的:

public final class Unsafe {private static final Unsafe theUnsafe;public static final int INVALID_FIELD_OFFSET = -1;private static native void registerNatives();// 構造函數是private的,不允許外部實例化private Unsafe() {}... }

因此我們無法在外部對Unsafe進行實例化。

獲取Unsafe

Unsafe無法實例化,那么怎么獲取Unsafe呢?答案就是通過反射來獲取Unsafe:

public Unsafe getUnsafe() throws IllegalAccessException {Field unsafeField = Unsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);return unsafe; }

主要功能

Unsafe的功能如下圖:

普通讀寫

通過Unsafe可以讀寫一個類的屬性,即使這個屬性是私有的,也可以對這個屬性進行讀寫。

讀寫一個Object屬性的相關方法

public native int getInt(Object var1, long var2);public native void putInt(Object var1, long var2, int var4);

getInt用于從對象的指定偏移地址處讀取一個int。putInt用于在對象指定偏移地址處寫入一個int。其他的primitive type也有對應的方法。

Unsafe還可以直接在一個地址上讀寫

public native byte getByte(long var1);public native void putByte(long var1, byte var3);

getByte用于從指定內存地址處開始讀取一個byte。putByte用于從指定內存地址寫入一個byte。其他的primitive type也有對應的方法。

volatile讀寫

普通的讀寫無法保證可見性和有序性,而volatile讀寫就可以保證可見性和有序性。

public native int getIntVolatile(Object var1, long var2);public native void putIntVolatile(Object var1, long var2, int var4);

getIntVolatile方法用于在對象指定偏移地址處volatile讀取一個int。putIntVolatile方法用于在對象指定偏移地址處volatile寫入一個int。

volatile讀寫相對普通讀寫是更加昂貴的,因為需要保證可見性和有序性,而與volatile寫入相比putOrderedXX寫入代價相對較低,putOrderedXX寫入不保證可見性,但是保證有序性,所謂有序性,就是保證指令不會重排序。

有序寫入

有序寫入只保證寫入的有序性,不保證可見性,就是說一個線程的寫入不保證其他線程立馬可見。

public native void putOrderedObject(Object var1, long var2, Object var4);public native void putOrderedInt(Object var1, long var2, int var4);public native void putOrderedLong(Object var1, long var2, long var4);

直接內存操作

我們都知道Java不可以直接對內存進行操作,對象內存的分配和回收都是由JVM幫助我們實現的。但是Unsafe為我們在Java中提供了直接操作內存的能力。

// 分配內存 public native long allocateMemory(long var1); // 重新分配內存 public native long reallocateMemory(long var1, long var3); // 內存初始化 public native void setMemory(long var1, long var3, byte var5); // 內存復制 public native void copyMemory(Object var1, long var2, Object var4, long var5, long var7); // 清除內存 public native void freeMemory(long var1);

CAS相關

JUC中大量運用了CAS操作,可以說CAS操作是JUC的基礎,因此CAS操作是非常重要的。Unsafe中提供了int,long和Object的CAS操作:

public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);

偏移量相關

public native long staticFieldOffset(Field var1);public native long objectFieldOffset(Field var1);public native Object staticFieldBase(Field var1);public native int arrayBaseOffset(Class<?> var1);public native int arrayIndexScale(Class<?> var1);

staticFieldOffset方法用于獲取靜態屬性Field在對象中的偏移量,讀寫靜態屬性時必須獲取其偏移量。objectFieldOffset方法用于獲取非靜態屬性Field在對象實例中的偏移量,讀寫對象的非靜態屬性時會用到這個偏移量。staticFieldBase方法用于返回Field所在的對象。arrayBaseOffset方法用于返回數組中第一個元素實際地址相對整個數組對象的地址的偏移量。arrayIndexScale方法用于計算數組中第一個元素所占用的內存空間。

線程調度

public native void unpark(Object var1);public native void park(boolean var1, long var2);public native void monitorEnter(Object var1);public native void monitorExit(Object var1);public native boolean tryMonitorEnter(Object var1);

park方法和unpark方法相信看過LockSupport類的都不會陌生,這兩個方法主要用來掛起和喚醒線程。LockSupport中的park和unpark方法正是通過Unsafe來實現的:

// 掛起線程 public static void park(Object blocker) {Thread t = Thread.currentThread();setBlocker(t, blocker); // 通過Unsafe的putObject方法設置阻塞阻塞當前線程的blockerUNSAFE.park(false, 0L); // 通過Unsafe的park方法來阻塞當前線程,注意此方法將當前線程阻塞后,當前線程就不會繼續往下走了,直到其他線程unpark此線程setBlocker(t, null); // 清除blocker }// 喚醒線程 public static void unpark(Thread thread) {if (thread != null)UNSAFE.unpark(thread); }

monitorEnter方法和monitorExit方法用于加鎖,Java中的synchronized鎖就是通過這兩個指令來實現的。

類加載

public native Class<?> defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6);public native Class<?> defineAnonymousClass(Class<?> var1, byte[] var2, Object[] var3);public native Object allocateInstance(Class<?> var1) throws InstantiationException;public native boolean shouldBeInitialized(Class<?> var1);public native void ensureClassInitialized(Class<?> var1);

defineClass方法定義一個類,用于動態地創建類。
defineAnonymousClass用于動態的創建一個匿名內部類。
allocateInstance方法用于創建一個類的實例,但是不會調用這個實例的構造方法,如果這個類還未被初始化,則初始化這個類。
shouldBeInitialized方法用于判斷是否需要初始化一個類。
ensureClassInitialized方法用于保證已經初始化過一個類。

內存屏障

public native void loadFence();public native void storeFence();public native void fullFence();

loadFence:保證在這個屏障之前的所有讀操作都已經完成。
storeFence:保證在這個屏障之前的所有寫操作都已經完成。
fullFence:保證在這個屏障之前的所有讀寫操作都已經完成。

?

總結

以上是生活随笔為你收集整理的Java中的Unsafe的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线看成人片 | 亚洲国产日韩在线一区 | 大奶子av | 亚洲人在线观看视频 | 欧美色一区二区三区在线观看 | 激情伊人五月天 | 全黄一级片 | 波多野结衣一区 | 双性懵懂美人被强制调教 | 午夜一级在线 | 在线免费色 | www.九九热.com| 草久久 | 成人免费版 | 男人的天堂中文字幕 | 美女扒开屁股让男人桶 | 在线观看免费黄视频 | 97精品久久 | 91成人精品国产刺激国语对白 | av先锋在线 | 久久黄色影视 | 欧美色图一区二区三区 | 无码熟妇人妻av | 久久中文字幕人妻 | 欧美淫 | 欧美日韩精品一区二区三区蜜桃 | 日本激情网 | 青青草97| 国产a v一区二区三区 | 天天干狠狠爱 | 秋霞毛片 | 国产制服91一区二区三区制服 | 国产精品电影一区二区三区 | 成人亚洲区| 国产男女视频在线观看 | 色婷婷国产精品视频 | 久久久91精品 | 天天操天天操天天射 | 肉性天堂 | 国产视频第二页 | av电影在线观看网址 | 日本少妇裸体做爰高潮片 | 一本之道高清无码视频 | 97色网 | 麻豆视频一区二区 | 一区二区三区国产av | 欧美精品在线一区二区 | 日韩一二区 | 欧美三级三级三级爽爽爽 | 日韩一二三四区 | 国产精品国产三级国产专播精品人 | 秋霞午夜鲁丝一区二区老狼 | 九九热精品在线观看 | 中国黄色免费 | 精品在线视频一区二区 | 久久久久99精品成人片三人毛片 | 国产sm调教一区二区 | 天天看黄色 | 亚洲激情视频在线观看 | 可以免费在线观看的av | 男男gay羞辱feet贱奴vk | 日韩欧美小视频 | 2019自拍偷拍| 久久人爽| 亚洲一区动漫 | 伊人色区| 久久亚洲精品中文字幕 | 欧美日韩综合视频 | 亚洲精品影院在线 | 男女黄床上色视频 | 在线小视频你懂的 | 影音先锋中文字幕在线播放 | 亚洲免费在线观看av | 老公吃小头头视频免费观看 | 国产3区| 国产欧美一区二区精品性色超碰 | 国内精品久久久久久久久久久 | 人成免费 | 精品国产乱子伦 | 久久免费少妇高潮久久精品99 | 91精品国产高潮对白 | 女人一区二区三区 | 2019亚洲天堂 | 特级淫片裸体免费看 | 黑丝美女一区二区 | 一区二区三区国产在线 | 亚洲乱码视频在线观看 | 99精品视频在线观看 | 国产一区二区在线精品 | 日韩av在线免费播放 | 中文字幕乱码人妻无码久久95 | 国产欧美精品一区二区色综合 | 国产精品久久久久久久久久久久 | 乱人伦xxxx国语对白 | 亚洲精品在线免费观看视频 | 午夜影院在线观看视频 | 超碰人人草 | 亚洲日本国产 | a天堂资源 |