iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >有哪些Unsafe类
  • 399
分享到

有哪些Unsafe类

2023-06-15 21:06:25 399人浏览 安东尼
摘要

本篇内容介绍了“有哪些Unsafe类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍首先在oracle的jdk8无法获取到sun.

本篇内容介绍了“有哪些Unsafe类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、简单介绍

首先在oraclejdk8无法获取到sun.misc包的源码,想看此包的源码可以直接下载openjdk。

1、预备工作

openjdk的源码我下载的是openjdk-8u40-src-b25-10_feb_2015,有需要的可以私信我,如果是我公众号粉丝,我会直接附加上这个百度云资源。在下载完成之后,然后就可以直接导入我们的eclipse了。

有哪些Unsafe类

windows->preference->installed  jres->选中jre->edit->rt.jar->source attachment->external  folders->openjdk源码路径。此时就可以查看我们的Unsafe类的源码了。

2、简介说明

如果你学习了一些java并发包里面的类源码的话,对这个Unsafe类一定不陌生,整个java并发包底层实现的核心就是它,在很久之前盛传着这个类将要在jdk9移除,事实上如果移除了那么一大批框架将会消失,比如说赫赫有名的Netty框架。最终jdk9出现的时候也只是对其进行了改进和优化。不过这也再一次说明了这个类的重要地位。

为什么说它一半是天使一半是魔鬼呢?要回答这个问题,我们还是要从其特性来解释。

Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,一旦能够直接操作内存,这也就意味着(1)不受JVM管理,也就意味着无法被GC,需要我们手动GC,稍有不慎就会出现内存泄漏。

(2)Unsafe的不少方法中必须提供原始地址(内存地址)和被替换对象的地址,偏移量要自己计算,一旦出现问题就是JVM崩溃级别的异常,会导致整个JVM实例崩溃,表现为应用程序直接crash掉。

(3)直接操作内存,也意味着其速度更快,在高并发的条件之下能够很好地提高效率。

因此,从上面三个角度来看,虽然在一定程度上提升了效率但是也带来了指针的不安全性。

下面我们深入到源码中看看,提供了什么方法直接操作内存。

二、源码分析

Unsafe中一共有82个public native修饰的方法,还有几十个基于这82个public  native方法的其他方法。这些方法大体可以归结为以下几类:

(1)初始化操作

(2)操作对象属性

(3)操作数组元素

(4)内存管理

(5)内存屏障

(6)线程挂起和回复

(7)CAS机制

下面我们对这些方法尽进行一个大致的分析。

1、初始化

//1、注册native方法,是的Unsafe类可以操作C语言  private static native void reGISterNatives();  static {      registerNatives();      sun.reflect.Reflection.registerMethodsToFilter(Unsafe.class, "getUnsafe");  }  //2、构造方法  private Unsafe() {}  //3、初始化方法  private static final Unsafe theUnsafe = new Unsafe();  //4、初始化方法实现  @CallerSensitive  public static Unsafe getUnsafe() {      Class<?> caller = Reflection.getCallerClass();      if (!VM.isSystemDomainLoader(caller.getClassLoader()))          throw new SecurityException("Unsafe");      return theUnsafe;  }

在这里我们看到Unsafe的初始化方法主要是通过getUnsafe方法的单例模式实现的,调用JVM本地方法registerNatives()和sun.reflect.Reflection,通过Reflection的getCallerClass判断当前调用的类是否是主类加载器(BootStrap  classLoader)加载的,否则的话抛出一个SecurityException。这也证明了一个问题,那就是只有由主类加载器(BootStrap  classLoader)加载的类才能调用这个类中的方法。

2、操作属性方法

(1)public native Object getObject(Object o, long offset);

通过给定的Java变量获取引用值。这里实际上是获取一个Java对象o中,获取偏移地址为offset的属性的值,此方法可以突破修饰符的抑制,也就是无视private、protected和default修饰符。类似的方法有getInt、getDouble等等。同理还有putObject方法。

(2)public native Object getObjectVolatile(Object o, long offset);

强制从主存中获取属性值。类似的方法有getIntVolatile、getDoubleVolatile等等。同理还有putObjectVolatile。

(3)public native void putOrderedObject(Object o, long offset, Object x);

设置o对象中offset偏移地址offset对应的Object型field的值为指定值x。这是一个有序或者有延迟的putObjectVolatile方法,并且不保证值的改变被其他线程立即看到。只有在field被volatile修饰并且期望被修改的时候使用才会生效。类似的方法有putOrderedInt和putOrderedLong。

(4)public native long staticFieldOffset(Field f);

返回给定的静态属性在它的类的存储分配中的位置(偏移地址)。

(5)public native long objectFieldOffset(Field f);

返回给定的非静态属性在它的类的存储分配中的位置(偏移地址)。

(6)public native Object staticFieldBase(Field f);

返回给定的静态属性的位置,配合staticFieldOffset方法使用。

3、操作数组

(1)public native int arrayBaseOffset(Class arrayClass);

返回数组类型的第一个元素的偏移地址(基础偏移地址)。

(2)public native int arrayIndexScale(Class arrayClass);

返回数组中元素与元素之间的偏移地址的增量。

这两个方法配合使用就可以定位到任何一个元素的地址。

4、内存管理

(1)public native int addressSize();

获取本地指针的大小(单位是byte),通常值为4或者8。常量ADDRESS_SIZE就是调用此方法。

(2)public native int pageSize();

获取本地内存的页数,此值为2的幂次方。

(3)public native long allocateMemory(long bytes);

分配一块新的本地内存,通过bytes指定内存块的大小(单位是byte),返回新开辟的内存的地址。

(4)public native long reallocateMemory(long address, long bytes);

通过指定的内存地址address重新调整本地内存块的大小,调整后的内存块大小通过bytes指定(单位为byte)。

(5)public native void setMemory(Object o, long offset, long bytes, byte  value);

将给定内存块中的所有字节设置为固定值(通常是0)。

5、线程挂起和恢复

(1)public native void unpark(Object thread);

释放被park创建的在一个线程上的阻塞。由于其不安全性,因此必须保证线程是存活的。

(2)public native void park(boolean isAbsolute, long time);`

阻塞当前线程,一直等道unpark方法被调用。

6、内存屏障

(1)public native void loadFence();

在该方法之前的所有读操作,一定在load屏障之前执行完成。

(2)public native void storeFence();

在该方法之前的所有写操作,一定在store屏障之前执行完成

(3)public native void fullFence();

在该方法之前的所有读写操作,一定在full屏障之前执行完成,这个内存屏障相当于上面两个(load屏障和store屏障)的合体功能。

7、CAS机制

public final native boolean compareAndSwapObject(     Object o, long offset, Object expected, Object x); public final native boolean compareAndSwapint(     Object o, long offset,int expected, int x); public final native boolean compareAndSwapLong(     Object o, long offset, long expected,long x);

这个Unsafe类其实是贯穿到整个java并发包体系中的,不管是你看原子包还是lock包底部都有这样的一个类,我们需要记住的不是每一个方法,而是上面七类的标题。也就是具体有什么功能。

三、使用

说了这么久的源码在这里才介绍其使用,是因为官方并不推荐我们使用,也就是说我们无法直接new出来一个Unsafe类出来,那我们该如何使用呢?在很久之前我曾写过一篇介绍java反射机制的文章,没错就是这个反射机制,牛的不行。Unsafe就可以通过反射机制来获取。

public class UnsafeTest {     public static void main(String[] args) throws Exception {         //这里的theUnsafe就是我们源码中的那个theUnsafe         Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");         theUnsafe.setAccessible(true);         Unsafe unsafe = (Unsafe) theUnsafe.get(null);          //1、创建对象实例         Author author = (Author) unsafe.allocateInstance(Author.class);         //2、操作对象的属性         Field ageField = Author.class.getDeclaredField("age");         long fieldOffset = unsafe.objectFieldOffset(ageField);         //3、操作数组         String[] strings = new String[]{"1", "2", "3"};         long i = unsafe.arrayBaseOffset(String[].class);         //4、操作内存         long address = unsafe.allocateMemory(8L);             } }

在这里只是给出一些简单的例子,其用法可以参照源码分析中那七个方向。

注意:面试时有个小技巧,对于java语言特性而言,有很多违背java语言设计的功能都可以用这个类去回答

“有哪些Unsafe类”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 有哪些Unsafe类

本文链接: https://www.lsjlt.com/news/281664.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 有哪些Unsafe类
    本篇内容介绍了“有哪些Unsafe类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简单介绍首先在Oracle的Jdk8无法获取到sun....
    99+
    2023-06-15
  • Java Unsafe知识点有哪些
    本篇内容介绍了“Java Unsafe知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!sun.misc.Unsafe作用:可以用来...
    99+
    2023-06-25
  • Java中Unsafe类有什么用
    小编给大家分享一下Java中Unsafe类有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Unsafe类是啥?Java最初被设计为一种安全的受控环境。尽...
    99+
    2023-06-21
  • 如何使用Unsafe类
    这篇文章主要讲解了“如何使用Unsafe类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Unsafe类”吧!Unsafe 基础首先我们来尝试获取一个Unsafe实例,如果按照new的...
    99+
    2023-06-15
  • java中Unsafe类怎么用
    这篇文章主要介绍了java中Unsafe类怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了...
    99+
    2023-06-28
  • Java使用Unsafe类的示例详解
    Unsafe 对象提供了非常底层的,操作内存、线程的方法,相当于开了后门。 在atomic类中CAS实现、LockSupport中park unpark的底层都调用了UnSafe中的...
    99+
    2024-04-02
  • ADO类有哪些
    本篇内容主要讲解“ADO类有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO类有哪些”吧!ADO包括了6个类:Connection,Command,Recordset,Errors,Pa...
    99+
    2023-06-17
  • Python类有哪些
    本篇内容介绍了“Python类有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!shutil:shutil.copyfile( src, ...
    99+
    2023-06-02
  • javalibrary有哪些类
    Java标准库中包含了大量的类,以支持各种不同的功能和任务。以下是一些常见的Java类:1. Object类:所有类的父类,提供了一...
    99+
    2023-08-31
    javalibrary
  • CSS伪类有哪些
    这篇“CSS伪类有哪些”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“CSS伪类有哪些”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们一起来看看具体内容吧。c...
    99+
    2023-06-06
  • LOB类型有哪些
    本篇内容主要讲解“LOB类型有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LOB类型有哪些”吧!LOB相关的概念 LOB类型: 将信息文件(十...
    99+
    2024-04-02
  • ddos有哪些种类
    ddos的种类有:SYN Flood攻击即洪水攻击,通过TCP建立3次握手连接的漏洞产生。ACK Flood是对虚假的ACK包,目标设备会直接回复RST包丢弃连接,属于原始方式的ddos攻击。UDP Flood,使用原始套接字伪造大量虚假源...
    99+
    2024-04-02
  • javascript类库有哪些
    常见的javascript类库有:1.Treesaver,用于创建杂志布局的javaScript框架;2.Highcharts,用于制作交互式图表的javaScript类库;3.Highlight.js,用于实现代码高亮的javaScrip...
    99+
    2024-04-02
  • Hibernate中有哪些类型分类
    本篇文章给大家分享的是有关Hibernate中有哪些类型分类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 实体(Entities)和值(values)为了理解很多与持久化...
    99+
    2023-06-17
  • css中有哪些伪类
    本篇文章为大家展示了css中有哪些伪类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 css伪类有:“:link”、“:visited”...
    99+
    2024-04-02
  • TypeScript的类型有哪些
    这篇文章主要介绍“TypeScript的类型有哪些”,在日常操作中,相信很多人在TypeScript的类型有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”TypeScri...
    99+
    2024-04-02
  • 有哪些缓冲类型
    这篇文章主要介绍“有哪些缓冲类型”,在日常操作中,相信很多人在有哪些缓冲类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些缓冲类型”的疑惑有所帮助!接下来,请跟着小编一...
    99+
    2024-04-02
  • jquery库类型有哪些
    小编给大家分享一下jquery库类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! jquer...
    99+
    2024-04-02
  • 有哪些元件类型
    有哪些元件类型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。元件类型有:1、图形元件,可用于静态图像和创建连接到主时间轴的可重用动画片段;2、按钮元件,可以创建...
    99+
    2023-06-20
  • qt常用类有哪些
    Qt是一个跨平台的应用程序开发框架,提供了丰富的类库来帮助开发人员快速开发应用程序。以下是一些常用的Qt类:1. QWidget:用...
    99+
    2023-08-16
    qt
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作