当前位置:首页 > 科技  > 软件

【揭秘】JUC并发工具包底层机制探究,Unsafe原来这么强大!

来源: 责编: 时间:2023-10-06 19:18:52 432观看
导读Unsafe介绍Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的

Unsafe介绍

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使得Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。java.util.concurrent.atomic包下的原子操作类,基本都是使用Unsafe实现的。XtZ28资讯网——每日最新资讯28at.com

Unsafe提供的API大致可分为内存操作、CAS、Class、对象操作、线程、系统信息获取、内存屏障、数组操作等几类。XtZ28资讯网——每日最新资讯28at.com

内存相关XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

java.util.concurrent.atomic包中的原子类基本都用的UnsafeXtZ28资讯网——每日最新资讯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);}

线程相关XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

LockSupport类中有应用unpark,parkXtZ28资讯网——每日最新资讯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相关XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

系统相关XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

内存屏障XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

loadFence:保证在这个屏障之前的所有读操作都已经完成。
storeFence:保证在这个屏障之前的所有写操作都已经完成。fullFence:保证在这个屏障之前的所有读写操作都已经完成。XtZ28资讯网——每日最新资讯28at.com

在java8中 有这个StampedLock类,该类中应用了内存屏障功能。XtZ28资讯网——每日最新资讯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.javaXtZ28资讯网——每日最新资讯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实例

Unsafe类是final且是单例的,并且theUnsafe字段是private;通过如下方法获取实例。XtZ28资讯网——每日最新资讯28at.com

方法1XtZ28资讯网——每日最新资讯28at.com

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

方法2XtZ28资讯网——每日最新资讯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简单应用

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

执行结果:XtZ28资讯网——每日最新资讯28at.com

图片图片XtZ28资讯网——每日最新资讯28at.com

对象操作2:XtZ28资讯网——每日最新资讯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()) ;}

图片图片XtZ28资讯网——每日最新资讯28at.com

Unsafe创建对象

当不知道即将使用的对象有何构造函数,或是不想使用现有对象的构造函数创建对象时,可以通过如下方式:XtZ28资讯网——每日最新资讯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简单实现原子操作类

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

完毕!!!XtZ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12128-0.html【揭秘】JUC并发工具包底层机制探究,Unsafe原来这么强大!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 了解微服务与云原生应用开发的最新趋势

下一篇: GO 中优雅编码和降低圈复杂度

标签:
  • 热门焦点
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top