java操作内存,简单讲解varhandle的使用

news2024/11/17 9:46:56

概述:按理说jdk8的unsafe类就够用了,估计是因为不安全的原因,到jdk9出了个varhandle类,到jdk21的时候出了Arena和MemorySegment,基本就可以取代unsafe类的使用了。这里我主要讲varhandle类,因为大部分人升级jdk顶多升到jdk17。

VarHandle 本身不能直接创建对象,它主要用于操作已经存在的对象。要使用 VarHandle,你需要先有一个对象实例,然后通过 MethodHandles.lookup().findVarHandle() 方法获取该对象的 VarHandle。

varhandle是Java 9中引入的一个新特性,用于更高效地访问对象字段。它提供了一种低级别的、直接的方式来操作对象的字段,而不需要通过反射。varhandle的主要优点是性能更好,因为它可以直接访问内存,而不需要在Java堆和本地堆之间复制数据。

实际操作

package org.cyl.spaceutils.varhandle;
import org.cyl.spaceutils.pojo.Human;

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;

public class VarHandleTest {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Human human=new Human();
        VarHandle xvarHandle = MethodHandles.lookup().findVarHandle(Human.class, "age", int.class);
        VarHandle yvarHandle = MethodHandles.lookup().findVarHandle(Human.class, "name", String.class);
        xvarHandle.set(human,18);
        yvarHandle.set(human,"zhangsan");
        System.out.println("name:"+yvarHandle.get(human));
        System.out.println("age:"+xvarHandle.get(human));
        System.out.println(human);
    }
}

human类代码

package org.cyl.spaceutils.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Human {
    public String name;
    public int age;
}

引入依赖

  <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
    </dependencies>

运行结果

上述代码讲解

  • 创建了一个Human对象实例,即human
  • 使用MethodHandles.lookup().findVarHandle()方法获取Human类的两个字段的VarHandle实例:
    • xvarHandle用于操作age字段(int类型)。
    • yvarHandle用于操作name字段(String类型)。
  • 使用xvarHandle.set()方法将human对象的age字段设置为18。
  • 使用yvarHandle.set()方法将human对象的name字段设置为"zhangsan"。
  • 使用yvarHandle.get()方法获取human对象的name字段值,并打印输出。
  • 使用xvarHandle.get()方法获取human对象的age字段值,并打印输出。
  • 最后,打印输出human对象,它的toString()方法将会被调用。

使用VarHandle可以实现对字段的原子操作,而无需使用synchronized关键字或java.util.concurrent.atomic包中的原子类。

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

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

相关文章

Excel小技巧-筛选带删除线的数据并删除

Excel小技巧-筛选带删除线的数据并删除 1、替换删除线2、筛选空行并删除 今天同事使用 Excel 的时候遇到一个需求&#xff0c;有些内容不在需要时会被标记删除线&#xff0c;后面再删除&#xff0c;但是由于数据比较多&#xff0c;不方便一个个删除&#xff0c;有没有什么办法能…

STM32 通过Modbus协议更改内部Flash(模仿EEPROM)的运行参数

main.c测试 uint8_t uart1RxBuf[64]{0};uint8_t Adc1ConvEnd0; uint8_t Adc2ConvEnd0;int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initial…

使用腾讯云快速搭建WordPress网站流程详解

专栏系列文章&#xff1a; WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么&#xff1f;为什么用它建站&#xff1f;怎么安装与部署&#xff1f; 初次安装WordPress后如何进行网站设置&#xff08;主题安装、…

阿里云k8s环境下,因slb限额导致的发布事故

一、背景 阿里云k8s容器&#xff0c;在发布java应用程序的时候&#xff0c;客户端访问出现500错误。 后端服务是健康且可用的&#xff0c;网关层大量500错误请求&#xff0c;slb没有流入和流出流量。 经过回滚&#xff0c;仍未能解决错误。可谓是一次血的教训&#xff0c;特…

数组与指针之二——二级指针之一

定义是这样&#xff1a; 多级指针&#xff08;二级指针&#xff09;&#xff0c;C语言多级指针的用法详解 (biancheng.net) 这是针对变量&#xff0c;且是一级一级的取的。但是我们经常要面对数组&#xff0c;用到二级指针。如前面第一篇所述&#xff0c;对一维数组名取地址&…

折扣价和折扣实时转换

背景 : react 项目 问题 : 在折扣数中输入折扣2.333333&#xff0c;中间会多很多0&#xff0c;输入2.222&#xff0c;不能正常输入到第三位 如下图 原因 : oFixed()数字转字符串时可能会导致精度问题 解决思路 : parseFloat来解析浮点数原代码 const calculateDiscountVal (p…

学习Java的第四天

目录 一、if选择结构 1、基本if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 2、if-else 选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a; 3、多重if选择结构 语法结构&#xff1a; 流程图&#xff1a; 示例&#xff1a…

如何让JMeter也生成精美详细allure测试报告

&#xff08;全文约2000字&#xff0c;阅读约需5分钟&#xff0c;首发于公众号&#xff1a;测试开发研习社&#xff0c;欢迎关注&#xff09; 内容目录&#xff1a; 一、需求 二、思路 三、验证 四、实现 五、优化 六、彩蛋 篇幅较长&#xff0c;建议先收藏后阅读 一、需…

Java项目:42 ssm的高校专业信息管理系统设计与实现001

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统可以提供信息显示和相应服务 管理员查看学生报名专业&#xff0c;管理专业&#xff0c;课程以及学生&#xff0c;查看学生提问并回答问题&#x…

飞驰云联CEO朱旭光荣获“科技领军人才”称号

2024年2月29日&#xff0c;苏州工业园区“优化营商环境暨作风效能建设大会”成功举办&#xff0c;会上公布了2023年度苏州工业园区第十七届第一批金鸡湖科技领军人才名单&#xff0c;Ftrans飞驰云联创始人兼CEO朱旭光先生凭借在数据安全以及文件交换领域取得的突出成果&#xf…

浅谈高并发的一些解决思路

前言 《中国互联网发展状况统计报告》指出&#xff0c;截至2020年6月&#xff0c;我国网民规模已经达到9.40亿&#xff0c;较2020年3月年增长3625万&#xff0c;除了如此庞大的用户基数&#xff0c;如今人们接入互联网的方式也越来越多样&#xff0c;小到智能手表&#xff0c;…

MySQL存储函数

存储函数是有返回值存储过程&#xff0c;存储函数的参数只能还是IN类型的 1、语法 create function 存储函数名称 &#xff08;[参数列表]&#xff09;Returns type [characterrastic...]Begin--SQL语句Return ..;End;characterrastic说明&#xff1a;Deterministic:相同的输…

纯css实现太极八卦图

感觉最近好像闯鬼了&#xff0c;赶紧写个八卦图避避邪&#xff0c;开玩笑了&#xff0c;不废话&#xff0c;上菜&#xff0c;看效果上代码。 效果 代码&#xff0c;你们都是大佬&#xff0c;这里就不解释代码了 &#xff08;hover会转动喔&#xff09;。 <!DOCTYPE html&g…

Linux:kubernetes(k8s)探针LivenessProbe的使用(9)

他做的事情就是当我检测的一个东西他不在规定的时间内存在的话&#xff0c;我就让他重启&#xff0c;这个检测的目标可以是文件或者端口等 我这个是在上一章的基础之上继续操作&#xff0c;我会保留startupProbe探针让后看一下他俩的执行优先的一个效果 Linux&#xff1a;kuber…

图机器学习(3)-连接层面的特征工程

0 问题定义 通过已经连接去猜未知连接&#xff1a; 有两个思路&#xff1a;

金融行业专题|基金超融合架构转型与场景探索合集(2023版)

更新内容 更新 SmartX 超融合在基金行业的覆盖范围、部署规模与应用场景。更新信创云资源池、关键业务系统性能优化等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎下载阅读电子书《金融核心生产业务场景探索文章合集》。 随着数字化经济的蓬勃发展&#xf…

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show()&#xff0c;这种样式不是很好看&#xff0c;所以就想办法重新搞了一个类似弹出消息的功能。原理很简单&#xff0c;就是弹出一个新窗体&#xff0c;然后等几秒窗体自动关闭。 先上效果图&#xff1a; 新建一个MsgHelper.cs类&…

板绘学习路线、技巧和日常练习-----线条基础(点线面)---持续补充

板绘学习路线、技巧和日常练习-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/136199248 虽然PS画线条可以用快捷键画&#xff0c;但是太AI了。我们需要线条包含更多的人性。所以通过我们心-脑-手&#xff0c;这样…

腾讯云2024年云服务器优惠价格表,不买后悔!

腾讯云服务器多少钱一年&#xff1f;61元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器165元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…