Unsafe -- Java的魔法类(一)

Unsafe -- Java的魔法类(一)


::: tip 原创不易,转载请注明来源 :::

一、简介

​ Unsafe,顾名思义,不安全的;Unsafe类位于sun.misc包下,执行低级、不安全操作的方法集合。对于号称是安全的编程语言Java来说,无疑它是个例外,不仅仅是因为它可以堆内存进行操作,还是通过非常规化手段获取到对象,还是对线程调度毛手毛脚,总是它不属于Java标准。因此,引得他的上司一度想干掉他(Oracle曾公开声明计划在jdk9去除Unsafe类),无奈他的势力分布太广泛,许多高性能开发库,例如Netty, Hadoop, Kafka等。Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的。但不得不提到,Unsafe类在提升Java运行效率,增强Java语言底层资源操作能力方面起到了很大的作用。

二、获取Unsafe实例

​ Unsafe类使用了单例模式,需要通过一个静态方法getUnsafe()进行获取。由于Unsafe类比较不安全,所以Unsafe类被创造的时候被做了些限制。普通方式进行获取实例会报java.lang.SecurityException: Unsafe异常, 原因是因为在进行获取Unsafe实例时,当且仅当调用getUnsafe方法的类为引导类加载器所加载时合法。源码如下:

1public static Unsafe getUnsafe() { 2 Class<?> caller = Reflection.getCallerClass(); 3 if (!VM.isSystemDomainLoader(caller.getClassLoader())) 4 throw new SecurityException("Unsafe"); 5 return theUnsafe; 6 }

网上通常有两类方式进行获取Unsafe实例:一类是把要获取Unsafe实例的类所在jar包路径追加到默认的bootstrap路径中。另外一种则是通过反射进行获取;示例如下:

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

三、Unsafe的一些方法的简单介绍

1、CAS类

  • java.util.concurrent.atomic相关类
  • Java AQS
  • CurrentHashMap

2、线程调度

  • 线程挂起、恢复 park(boolean isAbsolute, long time) / unpark(Object thread)
  • 获取、释放锁 monitorEnter(Object o) / monitorExit(Object o)

3、内存操作类

  • 分配、拷贝、扩充、释放堆外内存
  • 设置、获得给定地址中的值

4、系统相关

  • 返回内存页大小
  • 返回系统指针

5、数组相关

  • 返回数组元素内存大小
  • 返回数组首元素偏移地址

6、内存屏障

  • 禁止load、store重排序

7、对象操作

  • 获取对象成员属性在内存偏移量
  • 非常规对象实例化
  • 存储、获取指定偏移地址的变量值(包含延迟生效、volatile语义)

8、Class相关

  • 动态创建类(普通类、匿名类)
  • 获取field的内存地址偏移量
  • 检测、确保类初始化
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Unsafe -- Java的魔法类(二)

UnsafeJava的魔法类(二)原创不易,转载请注明来源文接上集,上集主要是对Unsafe类做了简单的介绍,从本问开始,主要是对Unsafe类的八大类的详细用法展开演述。1、CASjava.util.concurrent.atomic相关类JavaAQSConcurrentHashMapCAS即compareandswap,中文名被翻

AtomicStampedReference是怎样解决CAS的ABA问题

本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。什么是ABA问题但凡对Java有一点深入就会知道CAS,即compareAndSwap。在Java中使用Unsafe类提供的native方法可以直接操作内存,其中就有对compareAndSwap的实现。javapublicfinalnati

Java Unsafe 类

Unsafe类是啥?Java最初被设计为一种安全的受控环境。尽管如此,JavaHotSpot还是包含了一个“后门”,提供了一些可以直接操控内存和线程的低层次操作。这个后门类——sun.misc.Unsafe——被JDK广泛用于自己的包中,如java.nio和java.util.concurrent。但是丝毫不建议在生产环境中使用这

HashMap 怎么 hash?又如何 map?

HashMap 是Java中Map的一个实现类,它是一个双列结构(数据链表),这样的结构使得它的查询和插入效率都很高。HashMap允许null键和值,它的键唯一,元素的存储无序,并且它是线程不安全的。!(https://oscimg.oschina.net/oscnet/24e81018b69298cf434a8eb39682070

JAVA设计模式之单例设计模式

    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。