iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java中Unsafe的使用讲解
  • 182
分享到

java中Unsafe的使用讲解

2024-04-02 19:04:59 182人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1.获取unsafe2.获取unsafe前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8): unsafe可以帮

前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8):

unsafe可以帮我们直接去操作硬件资源,当然了是借助java的jit来进行的,官方不推荐使用,因为不安全,例如你使用unsafe创建一个超级大的数组,但是这个数组JVM是不管理的,只能你自己操作,容易oom,也不利于资源的回收。

好了,下面我们来看代码

1.获取unsafe


//1.最简单的使用方式是基于反射获取Unsafe实例
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);

2.获取unsafe


private static Unsafe unsafe = null;
private static Field getUnsafe = null; 
static {
    try {
        getUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
        getUnsafe.setAccessible(true);
        unsafe = (Unsafe) getUnsafe.get(null);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

随便只要你高兴,都可以获取到unfase,因为涉及到unfase 的权限问题,所以,我们只能使用这种方式获取,不然就是权限异常,

操作方法:



String[] strings = new String[]{"1", "2", "3"};
long i = unsafe.arrayBaseOffset(String[].class);
System.out.println("string[] base offset is :" + i);
 
//every index scale
long scale = unsafe.arrayIndexScale(String[].class);
System.out.println("string[] index scale is " + scale);
 
//print first string in strings[]
System.out.println("first element is :" + unsafe.getObject(strings, i));
 
//set 100 to first string
unsafe.putObject(strings, i + scale * 0, "100");
 
//print first string in strings[] again
System.out.println("after set ,first element is :" + unsafe.getObject(strings, i + scale * 0));


//调用allocateInstance函数避免了在我们不需要构造函数的时候却调用它
Data data = (Data) unsafe.allocateInstance(Data.class);
data.setId(1L);
data.setName("unsafe");
System.out.println(data);
 
//返回成员属性在内存中的地址相对于对象内存地址的偏移量
Field nameField = Data.class.getDeclaredField("name");
long fieldOffset = unsafe.objectFieldOffset(nameField);
//putLong,putInt,putDouble,putChar,putObject等方法,直接修改内存数据(可以越过访问权限)
unsafe.putObject(data,fieldOffset,"这是新的值");
System.out.println(data.getName());
  

File file = new File("C:\\workspace\\idea2\\disruptor\\target\\classes\\com\\onyx\\distruptor\\test\\Data.class");
FileInputStream input = new FileInputStream(file);
byte[] content = new byte[(int)file.length()];
input.read(content);
Class c = unsafe.defineClass(null, content, 0, content.length,null,null);
c.getMethod("getId").invoke(c.newInstance(), null);
   

//分配一个8byte的内存
long address = unsafe.allocateMemory(8L);
//初始化内存填充1
unsafe.setMemory(address, 8L, (byte) 1);
//测试输出
System.out.println("add byte to memory:" + unsafe.getInt(address));
//设置0-3 4个byte为0x7fffffff
unsafe.putInt(address, 0x7fffffff);
//设置4-7 4个byte为0x80000000
unsafe.putInt(address + 4, 0x80000000);
//int占用4byte
System.out.println("add byte to memory:" + unsafe.getInt(address));
System.out.println("add byte to memory:" + unsafe.getInt(address + 4));


Data data = new Data();
data.setId(1L);
Field id = data.getClass().getDeclaredField("id");
long l = unsafe.objectFieldOffset(id);
id.setAccessible(true);
//比较并交换,比如id的值如果是所期望的值1,那么就替换为2,否则不做处理
unsafe.compareAndSwapLong(data,1L,1L,2L);
System.out.println(data.getId());


//get os address size
System.out.println("address size is :" + unsafe.addressSize());
//get os page size
System.out.println("page size is :" + unsafe.pageSize());
//int array base offset
System.out.println("unsafe array int base offset:" + Unsafe.ARRAY_INT_BASE_OFFSET);
   

Thread packThread = new Thread(() -> {
    long startTime = System.currentTimeMillis();
    //纳秒,相对时间park
    unsafe.park(false,3000000000L);
    //毫秒,绝对时间park
    //unsafe.park(true,System.currentTimeMillis()+3000); 
    System.out.println("main thread end,cost :"+(System.currentTimeMillis()-startTime)+"ms");
});
packThread.start();
TimeUnit.SECONDS.sleep(1);
//注释掉下一行后,线程3秒数后进行输出,否则在1秒后输出
unsafe.unpark(packThread);


public class SuperArray { 
    private static Unsafe unsafe = null;
    private static Field getUnsafe = null; 
    static {
        try {
            getUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            getUnsafe.setAccessible(true);
            unsafe = (Unsafe) getUnsafe.get(null);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    } 
 
    private final static int BYTE = 1; 
    private long size;
    private long address; 
    public SuperArray(long size) {
        this.size = size;
        address = unsafe.allocateMemory(size * BYTE);
    }
 
    public void set(long i, byte value) {
        unsafe.putByte(address + i * BYTE, value);
    }
 
    public int get(long idx) {
        return unsafe.getByte(address + idx * BYTE);
    }
 
    public long size() {
        return size;
    } 
 
    public static void main(String[] args) {
        long SUPER_SIZE = (long)Integer.MAX_VALUE * 2;
        SuperArray array = new SuperArray(SUPER_SIZE);
        System.out.println("Array size:" + array.size()); // 4294967294
        int sum=0;
        for (int i = 0; i < 100; i++) {
            array.set((long)Integer.MAX_VALUE + i, (byte)3);
            sum += array.get((long)Integer.MAX_VALUE + i);
        }
        System.out.println(sum);
    } 
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: java中Unsafe的使用讲解

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

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

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

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

下载Word文档
猜你喜欢
  • java中Unsafe的使用讲解
    目录1.获取unsafe2.获取unsafe前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8): unsafe可以帮...
    99+
    2024-04-02
  • Java使用Unsafe类的示例详解
    Unsafe 对象提供了非常底层的,操作内存、线程的方法,相当于开了后门。 在atomic类中CAS实现、LockSupport中park unpark的底层都调用了UnSafe中的...
    99+
    2024-04-02
  • Java中Unsafe如何使用
    Java中Unsafe如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Unsafe介绍Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安...
    99+
    2023-06-15
  • Java中Unsafe怎么用
    这篇文章将为大家详细讲解有关Java中Unsafe怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Unsafe是什么首先我们说Unsafe类位于rt.jar里面sun.misc包下面,Unsafe翻译...
    99+
    2023-06-25
  • Java中Unsafe在安全领域的使用方法
    本文小编为大家详细介绍“Java中Unsafe在安全领域的使用方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中Unsafe在安全领域的使用方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。0 前言u...
    99+
    2023-06-29
  • Java中Unsafe类有什么用
    小编给大家分享一下Java中Unsafe类有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、Unsafe类是啥?Java最初被设计为一种安全的受控环境。尽...
    99+
    2023-06-21
  • java中Unsafe类怎么用
    这篇文章主要介绍了java中Unsafe类怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了...
    99+
    2023-06-28
  • Java Timer使用讲解
    目录Timer 详解定时功能一、一次性任务二、可重复执行任务三、固定延时和固定速率区别(重点)1. 介绍2. 固定速率3. 固定延时4. 其他要点四、调度多个TimerTa...
    99+
    2022-11-13
    Java Timer使用 Java Timer
  • Java中classpath讲解及使用方式
    笔者之前对于classpath都没有什么深入的研究,之前的项目打包jar包都是按照网上的教程自己照着葫芦画瓢。但是因为最近碰到一些关于这方面的知识,因此索性觉得要好好补充一下这方面的...
    99+
    2024-04-02
  • Java 中的 Unsafe 魔法类的作用大全
    Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java...
    99+
    2024-04-02
  • 了解一下Golang中的unsafe包
    在一些底层的库中, 经常会看到使用 unsafe 包的地方。本篇文章就来带大家了解一下Golang中的unsafe包,介绍一下unsafe 包的作用和Pointer的使用方式,希望对大家有所帮助!unsafe 包提供了一些操作可以绕过 go...
    99+
    2023-05-14
    Go 后端
  • Java深入讲解SPI的使用
    目录什么是Java SPIJava SPI使用demoSPI在JDBC中的应用SPI在sharding-jdbc中的应用扩展什么是Java SPI   &ensp...
    99+
    2024-04-02
  • Java实例讲解Comparator的使用
    目录前言关于Comparator原题前言 今天刷个题,遇到一个很有趣的问题,关于Comparator的使用,感觉也是一个关于写代码的一些小细节的问题 关于Comparator Com...
    99+
    2022-11-13
    Java Comparator方法 Java Comparator接口
  • Java中的Unsafe在安全领域的使用总结和复现(实例详解)
    目录0前言1基本使用1.1内存级别修改值1.2创建对象1.3创建VMAnonymousClass2利用姿势2.1修改值以关闭RASP等防御措施2.2创建NativeLibrary对象...
    99+
    2024-04-02
  • Java JDBC使用入门讲解
    目录1、JDBC概述1.1、JDBC的概念1.2、JDBC的本质1.3、JDBC的好处2、JDBC快速入门2.1、编写代码2.2、完整案例前言:本节我们开始学习JDBC,JDBC的基...
    99+
    2022-12-08
    Java JDBC Java JDBC是什么
  • 使用Java怎么实现一个CAS和Unsafe类
    本篇文章给大家分享的是有关使用Java怎么实现一个CAS和Unsafe类,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。两者对比sychronized和volatile都解决了内...
    99+
    2023-06-06
  • Java 超基础讲解String的使用
    目录1.String概述2.特点3.String构造方法4.String对象的特点5.字符串的比较6.实现用户登录7.总结1.String概述 String类在java.lang包下...
    99+
    2024-04-02
  • 你一定不知道的Java Unsafe用法详解
    目录Unsafe是什么如何正确地获取Unsafe对象Unsafe实现CAS锁使用Unsafe创建对象Unsafe加载类总结Unsafe是什么 首先我们说Unsafe类位于rt.jar...
    99+
    2024-04-02
  • java SelectableChannel的使实例用法讲解
    1、说明 (1)SelectableChannel 是一个抽象类,它实现了 Channel 接口,这个类比较特殊。 (2)SelectableChannel 可以被 Selector...
    99+
    2024-04-02
  • 【基本功】Java魔法类:Unsafe应用解析
    大家好,我是程序员鼓励师美美~《基本功》专栏又上新了:Java中的Unsafe类在提升运行效率、增强底层资源操作能力方面有很大的用处。但如果在开发过程中使用不当,就会出现各种“莫名其妙”的问题。本篇文章将会带领你重新认识它,绕过“开发雷区”...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作