成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【揭秘】JUC并發工具包底層機制探究,Unsafe原來這么強大!

開發 前端
在程序中過度、不正確使用Unsafe類會使得程序出錯的概率變大,使得Java這種安全的語言變得不再“安全”,因此對Unsafe的使用一定要慎重。java.util.concurrent.atomic包下的原子操作類,基本都是使用Unsafe實現的。

Unsafe介紹

Unsafe是位于sun.misc包下的一個類,主要提供一些用于執行低級別、不安全操作的方法,如直接訪問系統內存資源、自主管理內存資源等,這些方法在提升Java運行效率、增強Java語言底層資源操作能力方面起到了很大的作用。但由于Unsafe類使得Java語言擁有了類似C語言指針一樣操作內存空間的能力,這無疑也增加了程序發生相關指針問題的風險。在程序中過度、不正確使用Unsafe類會使得程序出錯的概率變大,使得Java這種安全的語言變得不再“安全”,因此對Unsafe的使用一定要慎重。java.util.concurrent.atomic包下的原子操作類,基本都是使用Unsafe實現的。

Unsafe提供的API大致可分為內存操作、CAS、Class、對象操作、線程、系統信息獲取、內存屏障、數組操作等幾類。

內存相關

圖片圖片

CAS相關

圖片圖片

java.util.concurrent.atomic包中的原子類基本都用的Unsafe

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);
}

線程相關

圖片圖片

LockSupport類中有應用unpark,park

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相關

圖片圖片

對象操作相關

圖片圖片

圖片圖片

系統相關

圖片圖片

內存屏障

圖片圖片

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

在java8中 有這個StampedLock類,該類中應用了內存屏障功能。

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.java

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實例

Unsafe類是final且是單例的,并且theUnsafe字段是private;通過如下方法獲取實例。

方法1

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

方法2

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簡單應用

int i = 0 ;


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

Unsafe對象操作

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();
  }
}

執行結果:

圖片圖片

對象操作2:

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()) ;
}

圖片圖片

Unsafe創建對象

當不知道即將使用的對象有何構造函數,或是不想使用現有對象的構造函數創建對象時,可以通過如下方式:

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簡單實現原子操作類

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);
  }


}

完畢!!!

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2009-11-17 14:39:59

PHP工具包

2009-02-03 14:00:20

PHP運行PHP調用PHP原理

2016-08-12 09:33:38

2024-12-17 08:28:30

2020-12-15 15:08:17

工具Java線程

2020-12-15 07:54:40

工具Hutoolgithub

2021-04-19 07:35:01

Linuxhistory命令

2021-04-26 10:24:52

Linux 開發操作系統

2025-01-28 00:00:00

OpenFeign接口依賴

2022-04-09 10:02:59

HTTPLInux開源

2018-05-03 09:03:16

微軟工具包Windows

2021-04-19 05:42:51

Mmap文件系統

2022-06-01 12:04:02

項目Webpack

2021-11-17 10:16:39

Kodex隱私安全工程工具包

2023-11-01 14:49:07

2020-02-10 16:07:42

工具包

2011-04-18 09:46:58

Windows工具包活動目錄MPS報告

2009-09-16 08:34:17

Windows Emb

2009-04-03 11:12:43

PalmwebOS開發

2023-02-15 08:26:29

iOS工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品日韩欧美一区二区三区 | 国产欧美精品区一区二区三区 | 久久久久久久av麻豆果冻 | 亚洲视频免费在线观看 | 福利片在线观看 | 极品一区| 国产91亚洲精品 | 日本中文字幕视频 | 日本激情视频中文字幕 | 色综合久久天天综合网 | 亚洲精品一区二区三区蜜桃久 | 一级特黄色毛片 | 日韩在线成人 | 亚洲欧美精品国产一级在线 | 久热久热| 好姑娘影视在线观看高清 | 日韩一区二区三区视频 | 精品国产一区二区三区观看不卡 | 亚洲五码在线 | 视频一区在线观看 | 人人九九 | 综合色播 | 亚洲综合精品 | 中文字幕国产 | 在线亚洲精品 | 国产91亚洲精品一区二区三区 | 欧美成人a∨高清免费观看 欧美日韩中 | 成人av网站在线观看 | 日韩视频观看 | 精品无码三级在线观看视频 | 91精品国产综合久久久亚洲 | 久久激情五月丁香伊人 | 毛片站 | 97超碰免费| 婷婷在线视频 | 怡红院成人在线视频 | 国产精品美女久久久av超清 | 国产在线h| 一区二区三区国产在线观看 | 精品国产乱码久久久久久88av | 久久久九九九九 |