Java中的Unsafe的介绍与使用

news2024/11/20 22:39:16

Java中的Unsafe的介绍与使用

相关文章 

美团-Unsafe 

JavaGuide-Unsafe

什么是Unsafe???

如何创建Unsafe对象?

通过反射获取Unsafe对象(案例)

Unsafe功能简介

1. 内存操作

2. 内存屏障

3. 对象操作

4. 数据操作

5. CAS 操作

6. 线程调度

7. Class 操作

8. 系统信息​​​​​​​


Java中的Unsafe的介绍与使用

相关文章 

美团-Unsafe 

Java魔法类:Unsafe应用解析 - 美团技术团队 (meituan.com)https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html

JavaGuide-Unsafe

Java 魔法类 Unsafe 详解 (javaguide.cn)https://javaguide.cn/java/basis/unsafe.html#unsafe-%E4%BB%8B%E7%BB%8D

什么是Unsafe???

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。

但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。

在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不安全,因此对Unsafe的使用一定要慎重

如何创建Unsafe对象?

我们无法直接通过new来实例化一个Unsafe对象。也不能通过 Unsafe.getUnsafe() 的方式,运行的时候会抛异常的。

我们只能通过反射的方式来创建这个对象(还有一种方式,“-Xbootclasspath/a”,但是没必要)

通过反射获取Unsafe对象(案例)

通过Unsafe获取内存中的偏移量 

public class UnsafeDemo {
    public static void main(String[] args) {

        try {
            // 返回这个类中的指定字段的Field对象
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            // true: 反射的对象在使用时抑制Java语言访问检查
            field.setAccessible(true);

            // 字段不是静态字段,要传入反射类的对象,如果传null是会报 java.lang.NullPointerException!
            // 字段是静态字段,传入任何对象都是可以的,包括null
            Unsafe unsafe = (Unsafe) field.get(field);
            // 返回对象成员属性在内存地址相对于此对象的内存地址的偏移量
            long nameOffset = unsafe.objectFieldOffset(Test.class.getDeclaredField("name"));
            long ageOffset = unsafe.objectFieldOffset(Test.class.getDeclaredField("age"));

            System.out.println(nameOffset); // 12
            System.out.println(ageOffset);  //16
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Test{
    private String name;
    private Integer age;

    public Test(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

Unsafe unsafe = (Unsafe) field.get(field)

在java的反射中,通过字段获取对象:

  1. 字段不是静态字段,要传入反射类的对象,如果传null是会报java.lang.NullPointerException 
  2. 字段是静态字段,传入任何对象都是可以的,包括null !

Unsafe功能简介

概括的来说,Unsafe 类实现功能可以被分为下面 8 类。

这里只是对API进行罗列,具体的使用可以参考:

Java 魔法类 Unsafe 详解 (javaguide.cn)icon-default.png?t=M85Bhttps://javaguide.cn/java/basis/unsafe.html#unsafe-%E5%8A%9F%E8%83%BD

1. 内存操作

我们都知道Java不可以直接对内存进行操作,对象内存的分配和回收都是由JVM帮助我们实现的。

但是Unsafe为我们在Java中提供了直接操作内存的能力

//分配新的本地空间
public native long allocateMemory(long bytes);

//重新调整内存空间的大小
public native long reallocateMemory(long address, long bytes);

//将内存设置为指定值
public native void setMemory(Object o, long offset, long bytes, byte value);

//内存拷贝
public native void copyMemory(Object srcBase, long srcOffset,Object destBase, long destOffset,long bytes);

//清除内存
public native void freeMemory(long address);

2. 内存屏障

内存屏障可以看做对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。

loadFence()方法为例,它会禁止读操作重排序,保证在这个屏障之前的所有读操作都已经完成,并且将缓存数据设为无效重新从主存中进行加载

//内存屏障,禁止load操作重排序。屏障前的load操作不能被重排序到屏障后,屏障后的load操作不能被重排序到屏障前
public native void loadFence();

//内存屏障,禁止store操作重排序。屏障前的store操作不能被重排序到屏障后,屏障后的store操作不能被重排序到屏障前
public native void storeFence();

//内存屏障,禁止load、store操作重排序
public native void fullFence();

3. 对象操作

//在对象的指定偏移地址获取一个对象引用
public native Object getObject(Object o, long offset);

//在对象指定偏移地址写入一个对象引用
public native void putObject(Object o, long offset, Object x);

//在对象的指定偏移地址处读取一个int值,支持volatile load语义
public native int getIntVolatile(Object o, long offset);

//在对象指定偏移地址处写入一个int,支持volatile store语义
public native void putIntVolatile(Object o, long offset, int x);

// 有序写入
public native void putOrderedObject(Object o, long offset, Object x);
public native void putOrderedInt(Object o, long offset, int x);
public native void putOrderedLong(Object o, long offset, long x);

4. 数据操作

//返回数组中第一个元素的偏移地址
public native int arrayBaseOffset(Class<?> arrayClass);

//返回数组中一个元素占用的大小
public native int arrayIndexScale(Class<?> arrayClass);

5. CAS 操作

/**
  *  CAS
  * @param o         包含要修改field的对象
  * @param offset    对象中某field的偏移量
  * @param expected  期望值
  * @param update    更新值
  * @return          true | false
  */
public final native boolean compareAndSwapObject(Object o, long offset,  Object expected, Object update);

public final native boolean compareAndSwapInt(Object o, long offset, int expected,int update);

public final native boolean compareAndSwapLong(Object o, long offset, long expected, long update);

6. 线程调度

方法 parkunpark 即可实现线程的挂起与恢复,将一个线程进行挂起是通过 park 方法实现的,调用 park 方法后,线程将一直阻塞直到超时或者中断等条件出现。

unpark 可以终止一个挂起的线程,使其恢复正常。

//取消阻塞线程
public native void unpark(Object thread);

//阻塞线程
public native void park(boolean isAbsolute, long time);

//获得对象锁(可重入锁)
@Deprecated
public native void monitorEnter(Object o);

//释放对象锁
@Deprecated
public native void monitorExit(Object o);

//尝试获取对象锁
@Deprecated
public native boolean tryMonitorEnter(Object o);

7. Class 操作

//获取静态属性的偏移量
public native long staticFieldOffset(Field f);

//获取静态属性的对象指针
public native Object staticFieldBase(Field f);

//判断类是否需要实例化(用于获取类的静态属性前进行检测)
public native boolean shouldBeInitialized(Class<?> c);

8. 系统信息​​​​​​​

//返回系统指针的大小。返回值为4(32位系统)或 8(64位系统)。
public native int addressSize();

//内存页的大小,此值为2的幂次方。
public native int pageSize();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猿如意中的【Sublime Text】开发工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载Sublime Text &#xff1f; 三、sublime text介绍 四、软件安装过程 五、软件界面 六、sublime text功能特点介绍 七、sublime tex…

【UDS】ISO15765-2之协议数据单元

文章目录简介结构格式分类1.单帧SF2.首帧FF3.流控帧FC4.连续帧CF总结->返回总目录<- 简介 网络层协议数据单元&#xff08;N_PDU&#xff0c;Network_Protocol Data Unit&#xff09;。可以理解成是一种规范协议。而汽车电子中通信的报文格式就是以PDU为传输单元&#…

COM通信栈

基于 AUTOSAR 架构的软件层概述 根据分层AUTOSAR 架构&#xff0c;软件开发是按照以下模块&#xff08;层&#xff09;&#xff08;自下而上&#xff09;实现的&#xff1a; 基本软件 (BSW) 层——这包括以下内容&#xff1a; 微控制器抽象层 (MCAL)电子控制单元 (ECU) 抽象层…

海关统计:全国、各省、各城市进出口贸易数据+地级市进出口贸易、对外贸易数据及进出口月度数据

&#xff08;1&#xff09;2004-2019年地级市进出口贸易总额数据 1、数据来源&#xff1a;各城市统计年鉴、省份统计年鉴 2、时间跨度&#xff1a;2004-2019 3、区域范围&#xff1a;全国287个地级市 4、指标说明&#xff1a; 人民币和美元两种计价方式&#xff0c;人民币…

【应用层】P2P、DNS、递归查询、迭代查询、FTP、电子邮件系统、万维网和HTTP

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录应用层---网络层点到点----传输层端到端------应用层为应用提供多样服务---------功能&#xff1a;文件传输、访问、管理ftp---电子邮件smtp---虚拟终端http-让个人用户直接与大型计算机联系&#xff0c;不必…

web期末作业设计网页——开平碉楼(20页)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

(附源码)SSM财务管理系统 毕业设计 282251

SSM财务管理系统的设计与实现 摘要 现实生活中&#xff0c;许多人风险意识不足&#xff0c;对个人财务风险管理的认识就更少。在进行财务决策时&#xff0c;更多依靠的是以往经验和个人判断&#xff0c;对决策对象缺乏细致的认知、分析和推断&#xff0c;更不用提风险防范与控制…

java中的Collecions类

java.util.Collections类提供了一些静态方法&#xff0c;这些方法能够对List集合实现常用的算法操作&#xff0c;这些算法是排序&#xff0c;填充&#xff0c;移位和查找等。 Collections的常用方法及其简单使用&#xff1a; 代码如下&#xff1a; package Collections; imp…

【考研·计算机组成原理】校验码 小结

本篇目录 前言 一、校验码 1.校验码 2.码距 3.检错与纠错 二、奇偶校验码 三、海明码 1.海明校验码的原理 2.校验位的计算方法 四、CRC码&#xff08;循环冗余校验&#xff09; 总结 前言 跟着王道的考研复习指导&#xff0c;学习了三种校验码&#xff0c;做一个小结。 一、校…

MATLAB应用1——MATLAB傅里叶变换函数封装

主程序&#xff1a; % eximportdata(data3.txt); tx regexp(ex{1}, \s, split);%按照空格分隔字符串,成为单个cell yxstr2double(tx); plot(yx); wwyx(2500:9000)-2055; Fyz_fft(ww,1000); 傅里叶封装函数&#xff1a; function Fyz_fft(y,Fs) % Demon: % Fs 128; …

web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

五分钟学会各种环形进度条

本文将会通过svg实现圆形进度条和矩形进度条以及三角形进度条&#xff0c;先放效果图 圆环进度条 首先我们需要两个画两个圆&#xff0c;一个是底色圆&#xff0c;一个是进度圆。 <svg width"200" height"200"><circle fill"none" cx…

Web 3.0顶级干货教学:区块链概述

Web 3.0顶级干货教学&#x1f525;&#xff1a;区块链定义&#xff1f; 尊重原创&#xff0c;本人致力于打造高质量博客&#xff0c;编写不易 &#xff0c;帮忙点赞关注一下~转载小伙伴请注明出处&#xff01;谢谢 区块链是什么&#xff1f; 最早使用历史 1991年采用 时间戳 追…

【大数据入门核心技术-Spark】(一)Spark介绍

​目录 ​一、Spark概述 二、为什么要学习Spark 三、Spark 四大特性 1、速度快 2、易用性 3、通用性 4、兼容性 一、Spark概述 Apache Spark™ is a unified analytics engine for large-scale data processing. spark是基于内存计算的大数据处理框架&#xff0c;由于基…

葡聚糖/聚己内酯两亲嵌段聚合物(Dextran-PCL)|5-氟尿嘧啶-右旋糖酐偶联物(DEX-5-Fu)

葡聚糖/聚己内酯两亲嵌段聚合物(Dextran-PCL)|5-氟尿嘧啶-右旋糖酐偶联物(DEX-5-Fu) 中文名称&#xff1a;葡聚糖/聚己内酯两亲嵌段聚合物 产品描述&#xff1a; 一种葡聚糖/聚己内酯两亲嵌段聚合物,它是由胺端基葡聚糖和醛端基聚己内酯通过偶联反应生成,其中葡聚糖链段的数均…

SSM框架学习记录-Spring_day03

1.AOP简介 代码参考Spring_17_aop_demo 什么是AOP&#xff1f; AOP(Aspect Oriented Programming)即面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 AOP作用 在BookDaoImpl.java中&#xff0c;执行save方法显然可以计算程序执行时间&#xff0c;…

Redis框架(三):大众点评项目 基于Session的短信登录

大众点评项目 基于Session的短信登录需求&#xff1a;基于Session实现短信验证登录基于Session的短信登录发送手机验证码实现登录 &#xff08;注意MyBatisP的接口使用&#xff09;新的问题SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将…

C#语言实例源码系列-实现无损压缩图片

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

微电网两阶段鲁棒优化问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Redis之相关介绍、远程docker部署以及相关shell命令

Redis相关shell命令一、概述1、介绍2、作用3、特性4、官方网址二、远程服务Docker上Redis相关测试及命令1、Redis安装及挂载1.1 查找所有关于Redis1.2 拉取最高版本的Redis1.3 通过xftp连接到远程服务器1.4 挂载1.5 开启远程服务器的端口1.6 修改配置文件2、开始使用Redis2.1 开…