Unsafe -- Java的魔法类(一)

红烧土豆泥
• 阅读 766

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方法的类为引导类加载器所加载时合法。源码如下:

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

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

Field declaredField = Unsafe.class.getDeclaredField("theUnsafe");
declaredField.setAccessible(true);
Unsafe 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的内存地址偏移量
  • 检测、确保类初始化
点赞
收藏
评论区
推荐文章
捉虫大师 捉虫大师
3年前
AtomicStampedReference是怎样解决CAS的ABA问题
本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。什么是ABA问题但凡对Java有一点深入就会知道CAS,即compareAndSwap。在Java中使用Unsafe类提供的native方法可以直接操作内存,其中就有对compareAndSwap的实现。javapublicfinalnati
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
红烧土豆泥 红烧土豆泥
3年前
Unsafe -- Java的魔法类(二)
UnsafeJava的魔法类(二)原创不易,转载请注明来源文接上集,上集主要是对Unsafe类做了简单的介绍,从本问开始,主要是对Unsafe类的八大类的详细用法展开演述。1、CASjava.util.concurrent.atomic相关类JavaAQSConcurrentHashMapCAS即compareandswap,中文名被翻
Wesley13 Wesley13
3年前
Java Unsafe 类
Unsafe类是啥?Java最初被设计为一种安全的受控环境。尽管如此,JavaHotSpot还是包含了一个“后门”,提供了一些可以直接操控内存和线程的低层次操作。这个后门类——sun.misc.Unsafe——被JDK广泛用于自己的包中,如java.nio和java.util.concurrent。但是丝毫不建议在生产环境中使用这
Stella981 Stella981
3年前
HashMap 怎么 hash?又如何 map?
HashMap 是Java中Map的一个实现类,它是一个双列结构(数据链表),这样的结构使得它的查询和插入效率都很高。HashMap允许null键和值,它的键唯一,元素的存储无序,并且它是线程不安全的。!(https://oscimg.oschina.net/oscnet/24e81018b69298cf434a8eb39682070
Wesley13 Wesley13
3年前
JAVA设计模式之单例设计模式
    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。
Wesley13 Wesley13
3年前
Java8 新特性之集合操作Stream
Java8新特性之集合操作StreamStream简介Java8引入了全新的StreamAPI。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。
Wesley13 Wesley13
3年前
Java最常见的面试题:模块二
容器18\.java容器都有哪些?常用容器的图录:19\.Collection和Collections有什么区别?java.util.Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库
Wesley13 Wesley13
3年前
Java集合框架一览笔录
1、集合概念集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所以的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供了一些多线程支持的集合类。集合分为两大类:Collection、Map。Collection(集合),每个元素存储单个
小万哥 小万哥
9个月前
Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间
Java用户输入(Scanner)简介Scanner类用于获取用户输入,它位于java.util包中。使用Scanner类要使用Scanner类,请执行以下步骤:1.导入java.util.Scanner包。2.创建一个Scanner对象,并将其初始化为S