首页 > 其他分享 >unsafe类常见的方法

unsafe类常见的方法

时间:2023-05-16 15:45:32浏览次数:52  
标签:Object var1 var2 常见 unsafe long 偏移量 方法

前言

Unsafe类提供了硬件级别的的原子性操作,Unsafe类中的方法都是native方法,通过使用JNI的方式访问本地C++库。

unsafe类在jdk源码中得到了非常广泛的应用,是理解jdk源码的基础,今天我们就来分享一下其中常见的方法。

1.compareAndSwapInt方法说明

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

该方法共有四个参数,方法主要实现的作用是:从var1对象的起始指针移动var2位,如果该位置上存储的值等于var4,那么将该值修改成var5。

  • var1:比较的对象
  • var2:指针偏移量
  • var4:条件值
  • var5:新值

除了这个方法,像Unsafe中的compareAndSwapObject、compareAndSwapLong方法都是类似的作用。

2.getObjectVolatile方法说明

public native Object getObjectVolatile(Object var1, long var2);

该方法又两个参数,该方法的主要作用是:获取当前对象var1在该对象指定偏移量var2上的值

  • var1:待计算的对象
  • var2:在对象上的偏移量

除了这个方法,像Unsafe中的getIntVolatile、getBooleanVolatile、getByteVolatile、getShortVolatile、getCharVolatile、getLongVolatile、getFloatVolatile、getDoubleVolatile等方法都是类似的作用。

3.putObject方法说明

public native void putObject(Object var1, long var2, Object var4);

该方法有三个参数,该方法的主要作用是:修改对象var1上偏移var2后位置上的值为var4。

  • var1:待修改的对象
  • var2:偏移量
  • var4:新值

除了这个方法,像Unsafe中的putBoolean、putByte、putChar、putLong、putFloat、putDouble等方法都是类似的作用。

4.objectFieldOffset方法说明

public native long objectFieldOffset(Field var1);

该方法只有一个参数,类型为Field,该方法的主要作用是:获取当前对象var1字段在该对象的偏移量

  • var1:对象中的字段

获得该偏移量之后就可以通过compareAndSwapInt这个方法,原子修改var1的值

5.getAndSetLong方法说明

long getAndSetLong(Object obj , long offset, long update)

方法: 获取对象 obj 中偏移量为offset 的变量 volatile语义的当前值 ,并设置变量 volatile 语义的值为 update

6.getAndAddLong方法说明

long getAndAddLong(Object obj, long offset, long addValue)

方法: 获取对象obj中偏移量为 offset 的变量 volatile 语义的当前值 ,并设置变量值为原始值+addValue

标签:Object,var1,var2,常见,unsafe,long,偏移量,方法
From: https://www.cnblogs.com/r1-12king/p/17405840.html

相关文章

  • 统计学习方法笔记-感知机学习方法
    感知机(Perceptron)1.感知机模型1.1感知机定义​ 输入空间$\mathcal{X}\subseteq\mathbb{R}^n$,输出空间\(\mathcal{Y}\)={+1,-1};​ 输入\(x\in\mathcal{X}\)表示的实例的特征向量,对应于输入空间的点,输出\(y\in\mathcal{Y}\)表示的实例的类别;由输入空间到输出空间的......
  • 易基因:多组学关联分析及组学分子实验验证方法(表观组+转录组+微生物组)|干货系列
    大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。生物过程具有复杂性和整体性,单组学数据难以系统全面解析复杂生理过程的分子调控机制。而多组学(Multi-omics)联合分析可同时实现从“因”和“果”两个层面研究生物学问题,并对其相关性进行验证。高通量技术的发展,通过对......
  • PLSQL Developer 15 中文乱码解决方法
    PLSQLDeveloper15汉字中文乱码解决方法 添加两个系统变量1.变量名:LANG变量值:zh_CN.GBK2.变量名:NLS_LANG变量值:SIMPLIFIEDCHINESE_CHINA.ZHS16GBK注意:上面的变量名和变量值最好使用复制粘贴的方式添加,防止手动填写出错。设置好后,点击“确定”按钮保存添加的环境变量。重......
  • 学习Web前端有什么好方法吗?
    很多人想要学习Web前端,但是又不知道从何入手。事实上,想要学好Web前端,掌握正确的学习方法很重要。为大家具体讲解一下,学习Web前端需要掌握的学习方法有哪些。 一、了解什么是Web前端 所谓“知己知彼,百战不殆”,在学习Web前端之前,首先应该了解什么是Web前端。所有的用户终端产品与视......
  • JS / jQuery 刷新页面的方法
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title></title><!--引入jQuery--><scriptsrc="jq.js"></script></head><body>......
  • 为什么被final修饰的方法不能被子类重写(无法被覆盖)
       方法覆盖是子类重写父类的方法实现。如果一个方法被final修饰,那么子类是无法重写该方法。注意final关键字只是让方法无法被覆盖,但不影响方法的继承。子类依旧可以继承父类的final方法,只是不能对其实现进行修改。好处就是:防止子类不经意间修改父类方法的实现,破坏了程序的正......
  • 常见问题——Quartz.net 部署IIS
    问题:Quartz部署在IIS失效原因:IIS一般默认应用程序池有设置固定时间间隔(分钟)默认1740,以及闲置超时(分钟)默认20解决方案:IIS->应用程序池->选中指定的网站右键高级设置->回收->固定时间间隔(分钟)设置为0IIS->应用程序池->进程模型->限制时间(分钟)设置为0......
  • .NET6项目连接数据库方式方法
    前言接上一篇Linux系统下创建dotnet项目,这一篇我们聊聊.NET6环境下dotnet项目连接数据库的方式方法,包括数据库字符串该如何配置。看了很多博主写的文章,连接数据库字符串配置的方式和位置五花八门,这篇文章给大家介绍一下连接数据库字符串的配置方式方法,顺便介绍下一个新创建的dotn......
  • 用Java集合中的Collections.sort方法对list排序的两种方法
    用Collections.sort方法对list排序有两种方法[color=darkblue][b]第一种是list中的对象实现Comparable接口[/b][/color],如下:/***根据order对User排序*/publicclassUserimplementsComparable{privateStringname;privateIntegerorder;publicStringge......
  • C#异步方法async/await的三种返回类型
    有群友问C#异步方法async返回值Task和void的区别?看似简单,但不容易把它们用好。在C#中的异步编程已经成为现代编程的标配,异步方法(async/await)是实现异步编程的一种常用方式。在异步方法中,可以使用Task或void作为返回类型,还可以使用ValueTask返回类型。本文将介绍异步方法中3个......