日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

【揭秘】JUC并發(fā)工具包底層機(jī)制探究,Unsafe原來(lái)這么強(qiáng)大!

來(lái)源: 責(zé)編: 時(shí)間:2023-10-06 19:18:52 318觀看
導(dǎo)讀Unsafe介紹Unsafe是位于sun.misc包下的一個(gè)類,主要提供一些用于執(zhí)行低級(jí)別、不安全操作的方法,如直接訪問(wèn)系統(tǒng)內(nèi)存資源、自主管理內(nèi)存資源等,這些方法在提升Java運(yùn)行效率、增強(qiáng)Java語(yǔ)言底層資源操作能力方面起到了很大的

Unsafe介紹

Unsafe是位于sun.misc包下的一個(gè)類,主要提供一些用于執(zhí)行低級(jí)別、不安全操作的方法,如直接訪問(wèn)系統(tǒng)內(nèi)存資源、自主管理內(nèi)存資源等,這些方法在提升Java運(yùn)行效率、增強(qiáng)Java語(yǔ)言底層資源操作能力方面起到了很大的作用。但由于Unsafe類使得Java語(yǔ)言擁有了類似C語(yǔ)言指針一樣操作內(nèi)存空間的能力,這無(wú)疑也增加了程序發(fā)生相關(guān)指針問(wèn)題的風(fēng)險(xiǎn)。在程序中過(guò)度、不正確使用Unsafe類會(huì)使得程序出錯(cuò)的概率變大,使得Java這種安全的語(yǔ)言變得不再“安全”,因此對(duì)Unsafe的使用一定要慎重。java.util.concurrent.atomic包下的原子操作類,基本都是使用Unsafe實(shí)現(xiàn)的。cWW28資訊網(wǎng)——每日最新資訊28at.com

Unsafe提供的API大致可分為內(nèi)存操作、CAS、Class、對(duì)象操作、線程、系統(tǒng)信息獲取、內(nèi)存屏障、數(shù)組操作等幾類。cWW28資訊網(wǎng)——每日最新資訊28at.com

內(nèi)存相關(guān)cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

java.util.concurrent.atomic包中的原子類基本都用的UnsafecWW28資訊網(wǎng)——每日最新資訊28at.com

private static final Unsafe unsafe = Unsafe.getUnsafe();private static final long valueOffset;static {  try {    valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));  } catch (Exception ex) { throw new Error(ex); }}public final int getAndSet(int newValue) {  return unsafe.getAndSetInt(this, valueOffset, newValue);}

線程相關(guān)cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

LockSupport類中有應(yīng)用unpark,parkcWW28資訊網(wǎng)——每日最新資訊28at.com

public static void park(Object blocker) {  Thread t = Thread.currentThread();  setBlocker(t, blocker);  UNSAFE.park(false, 0L);  setBlocker(t, null);}
public static void unpark(Thread thread) {  if (thread != null)    UNSAFE.unpark(thread);}

Class相關(guān)cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

系統(tǒng)相關(guān)cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

內(nèi)存屏障cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

loadFence:保證在這個(gè)屏障之前的所有讀操作都已經(jīng)完成。
storeFence:保證在這個(gè)屏障之前的所有寫操作都已經(jīng)完成。fullFence:保證在這個(gè)屏障之前的所有讀寫操作都已經(jīng)完成。cWW28資訊網(wǎng)——每日最新資訊28at.com

在java8中 有這個(gè)StampedLock類,該類中應(yīng)用了內(nèi)存屏障功能。cWW28資訊網(wǎng)——每日最新資訊28at.com

private static final sun.misc.Unsafe U;static {  try {    U = sun.misc.Unsafe.getUnsafe();  } catch (Exception e) {    throw new Error(e);  }}public boolean validate(long stamp) {  U.loadFence();  return (stamp & SBITS) == (state & SBITS);}

Unsafe.javacWW28資訊網(wǎng)——每日最新資訊28at.com

public final class Unsafe {  private static native void registerNatives();  static {    registerNatives();    sun.reflect.Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe");  }  private Unsafe() {}  private static final Unsafe theUnsafe = new Unsafe();  // ...}

獲取Unsafe實(shí)例

Unsafe類是final且是單例的,并且theUnsafe字段是private;通過(guò)如下方法獲取實(shí)例。cWW28資訊網(wǎng)——每日最新資訊28at.com

方法1cWW28資訊網(wǎng)——每日最新資訊28at.com

Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe") ;theUnsafe.setAccessible(true) ;Unsafe unsafe = (Unsafe) theUnsafe.get(null) ;

方法2cWW28資訊網(wǎng)——每日最新資訊28at.com

private static Unsafe unsafe = null ;static {  try {    Constructor<Unsafe> cons = Unsafe.class.getDeclaredConstructor() ;    cons.setAccessible(true) ;    unsafe = cons.newInstance() ;  } catch (Exception e) {    e.printStackTrace();  }}

Unsafe簡(jiǎn)單應(yīng)用

int i = 0 ;public static void main(String[] args) throws Exception {  UnsafeDemo d = new UnsafeDemo() ;  // 獲取Unsafe實(shí)例  Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe") ;  theUnsafe.setAccessible(true) ;  Unsafe unsafe = (Unsafe) theUnsafe.get(null) ;  // 獲取類的實(shí)例變量  Field f = UnsafeDemo.class.getDeclaredField("i") ;  // 獲取字段相對(duì)Java對(duì)象的"起始地址"的偏移量  long fieldOffset = unsafe.objectFieldOffset(f) ;  System.out.println(fieldOffset) ;  // 設(shè)置值  boolean success = unsafe.compareAndSwapInt(d, fieldOffset, 0, 10) ;  System.out.println(success) ;  System.out.println(d.i) ;}

Unsafe對(duì)象操作

private static Unsafe unsafe = null ;static {try {    Constructor<Unsafe> cons = Unsafe.class.getDeclaredConstructor() ;    cons.setAccessible(true) ;    unsafe = cons.newInstance() ;  } catch (Exception e) {    e.printStackTrace();  }}public static void allocate() {  try {    Person p = (Person)unsafe.allocateInstance(Person.class) ;    p.setId("s001");    System.out.println(p.getValue()) ;    System.out.println(p.getId()) ;  } catch (Exception e) {    e.printStackTrace();  }}

執(zhí)行結(jié)果:cWW28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

對(duì)象操作2:cWW28資訊網(wǎng)——每日最新資訊28at.com

private Person p = new Person("1", "張三") ;public static void main(String[] args) throws Exception {  UnSafeObjectDemo d = new UnSafeObjectDemo() ;  Field field = Unsafe.class.getDeclaredField("theUnsafe") ;  field.setAccessible(true) ;  Unsafe unsafe = (Unsafe) field.get(null) ;  Field f = d.getClass().getDeclaredField("p") ;  long offset = unsafe.objectFieldOffset(f) ;  System.out.println(offset) ;  boolean res = unsafe.compareAndSwapObject(d, offset, d.p, new Person("2", "李四")) ;  System.out.println(res) ;  System.out.println(d.p.getName()) ;}

圖片圖片cWW28資訊網(wǎng)——每日最新資訊28at.com

Unsafe創(chuàng)建對(duì)象

當(dāng)不知道即將使用的對(duì)象有何構(gòu)造函數(shù),或是不想使用現(xiàn)有對(duì)象的構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),可以通過(guò)如下方式:cWW28資訊網(wǎng)——每日最新資訊28at.com

Constructor<Teacher> cons = (Constructor<Teacher>) ReflectionFactory    .getReflectionFactory()    .newConstructorForSerialization(Teacher.class, Object.class.getConstructor());cons.setAccessible(true) ;Teacher t = cons.newInstance() ;System.out.println(t) ;

Unsafe簡(jiǎn)單實(shí)現(xiàn)原子操作類

public class AtomicCount {  private static Unsafe unsafe ;  private int value ;  private static long valueOffset ;  static {    try {      Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe") ;      theUnsafe.setAccessible(true) ;      unsafe = (Unsafe) theUnsafe.get(null) ;      Field f = AtomicCount.class.getDeclaredField("value") ;      valueOffset = unsafe.objectFieldOffset(f) ;    } catch (Exception e) {      e.printStackTrace();    }  }  public AtomicCount(int value) {    this.value = value ;  }  public final int get() {    return value;  }  public final int getAndIncrement() {    return unsafe.getAndAddInt(this, valueOffset, 1);  }}

完畢!!!cWW28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-12128-0.html【揭秘】JUC并發(fā)工具包底層機(jī)制探究,Unsafe原來(lái)這么強(qiáng)大!

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 了解微服務(wù)與云原生應(yīng)用開(kāi)發(fā)的最新趨勢(shì)

下一篇: GO 中優(yōu)雅編碼和降低圈復(fù)雜度

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來(lái)看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來(lái)源安兔兔評(píng)測(cè),收集時(shí)間2023年5月1日至5月31日,僅限國(guó)內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • 得物效率前端微應(yīng)用推進(jìn)過(guò)程與思考

    一、背景效率工程隨著業(yè)務(wù)的發(fā)展,組織規(guī)模的擴(kuò)大,越來(lái)越多的企業(yè)開(kāi)始意識(shí)到協(xié)作效率對(duì)于企業(yè)團(tuán)隊(duì)的重要性,甚至是決定其在某個(gè)行業(yè)競(jìng)爭(zhēng)中突圍的關(guān)鍵,是企業(yè)長(zhǎng)久生存的根本。得物
  • 十個(gè)簡(jiǎn)單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強(qiáng)大而靈活的功能,用于修改或增強(qiáng)函數(shù)或類的行為。裝飾器本質(zhì)上是一個(gè)函數(shù),它接受另一個(gè)函數(shù)或類作為參數(shù),并返回一個(gè)新的函數(shù)或類。它們通常用
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • 三分鐘白話RocketMQ系列—— 如何發(fā)送消息

    我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(chǔ)(消息堆積)、消費(fèi) 三大塊領(lǐng)域。那接下來(lái),我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過(guò)程。注意,如果白話中不小心提到相關(guān)代
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價(jià)位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個(gè)版本,其中標(biāo)準(zhǔn)版搭載高通驍龍8+,而Pro版更是首發(fā)搭載了聯(lián)發(fā)科天璣9200+旗艦
  • 與兆芯合作 聯(lián)想推出全新旗艦版筆記本電腦開(kāi)天N7系列

    聯(lián)想與兆芯合作推出全新聯(lián)想旗艦版筆記本電腦開(kāi)天 N7系列。這個(gè)系列采用兆芯KX-6640MA處理器平臺(tái),KX-6640MA 處理器是采用了陸家嘴架構(gòu),16nm 工藝,4 核 4 線
  • 上海舉辦人工智能大會(huì)活動(dòng),建設(shè)人工智能新高地

    人工智能大會(huì)在上海浦江兩岸隆重拉開(kāi)帷幕,人工智能新技術(shù)、新產(chǎn)品、新應(yīng)用、新理念集中亮相。8月30日晚,作為大會(huì)的特色活動(dòng)之一的上海人工智能發(fā)展盛典人工
  • 電博會(huì)上海爾智家模擬500平大平層,還原生活空間沉浸式體驗(yàn)

    電博會(huì)為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會(huì)上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗(yàn)。程傳
Top 主站蜘蛛池模板: 高雄县| 兴宁市| 宜宾县| 宝应县| 宁夏| 水富县| 运城市| 陵水| 曲靖市| 岱山县| 探索| 平罗县| 蓝田县| 仙桃市| 汉中市| 张掖市| 新干县| 永福县| 贵德县| 汽车| 塔城市| 潮安县| 扶绥县| 登封市| 寻乌县| 诸暨市| 梅河口市| 呼玛县| 长治市| 错那县| 西充县| 上杭县| 邢台县| 屯昌县| 齐齐哈尔市| 庐江县| 眉山市| 沁源县| 平邑县| 渭源县| 邢台市|