JAVA Unsafe 类介绍

2024-08-21 22:28
文章标签 java 介绍 unsafe

本文主要是介绍JAVA Unsafe 类介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unsafe 类提供了低级别、不安全的原始操作,这些操作可以直接访问内存。由于这些操作非常强大,可以直接操作内存,因此也非常危险。如果使用不当,可能会导致严重的内存泄露问题。

Unsafe 类的主要功能包括:

  1. 直接内存访问:可以分配和释放内存,创建和操作对象。

  private static final int BUFFER_SIZE = 1024;// 获取Unsafe实例private static final Unsafe unsafe = getUnsafeInstance();// 分配内存private static final long buffer = unsafe.allocateMemory(BUFFER_SIZE);private static Unsafe getUnsafeInstance() {try {Field field = Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);return (Unsafe) field.get(null);} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {// 使用直接内存unsafe.setMemory(buffer, BUFFER_SIZE, (byte) 0);// ... 进行其他操作// 释放内存unsafe.freeMemory(buffer);}

  1. 线程和锁:提供了线程的挂起和恢复、定时等待等操作。

    private static final Unsafe UNSAFE;private static final long THREAD_PTR;static {try {Field field = Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);UNSAFE = (Unsafe) field.get(null);Thread currentThread = Thread.currentThread();THREAD_PTR = UNSAFE.getLong(currentThread, UNSAFE.objectFieldOffset(Thread.class.getDeclaredField("threadStatus")));} catch (Exception e) {throw new Error(e);}}public static void parkThread() {UNSAFE.park(false, 0L);}public static void unparkThread() {UNSAFE.unpark(Thread.currentThread());}public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {System.out.println("Thread is going to be parked");parkThread();System.out.println("Thread is unparked");});thread.start();Thread.sleep(1000); // Wait for the thread to start and print the first messageunparkThread(); // Unpark the thread}
  1. 可见性操作:提供了一些方法来保证线程间的可见性。

      private static final Unsafe UNSAFE;private static final long VALUE_OFFSET;static {try {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);UNSAFE = (Unsafe) theUnsafe.get(null);VALUE_OFFSET = UNSAFE.objectFieldOffset(UnsafeVisibilityExample.class.getDeclaredField("value"));} catch (Exception e) {throw new Error(e);}}private volatile int value = 0;public void increaseValue() {UNSAFE.putOrderedInt(this, VALUE_OFFSET, value + 1);}public int getValue() {return value;}public static void main(String[] args) throws InterruptedException {UnsafeVisibilityExample example = new UnsafeVisibilityExample();Thread t1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increaseValue();}});Thread t2 = new Thread(() -> {while (example.getValue() < 10000) {// Busy wait until condition is met}});t1.start();t2.start();t1.join();t2.join();System.out.println("Value after both threads have finished: " + example.getValue());}

  2. CAS 操作:提供了 CompareAndSwap 等原子操作。

    private static final Unsafe UNSAFE;private static final long VALUE_OFFSET;static {try {Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);UNSAFE = (Unsafe) theUnsafe.get(null);VALUE_OFFSET = UNSAFE.objectFieldOffset(UnsafeTest.class.getDeclaredField("value"));} catch (Exception e) {throw new Error(e);}}private volatile int value;public static void main(String[] args) {UnsafeTest unsafeTest = new UnsafeTest();unsafeTest.value = 10;System.out.println("Before: " + unsafeTest.value);boolean success = UNSAFE.compareAndSwapInt(unsafeTest, VALUE_OFFSET, 10, 20);System.out.println("Success: " + success);System.out.println("After: " + unsafeTest.value);}

这篇关于JAVA Unsafe 类介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094451

相关文章

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Spring Boot 3 整合 Spring Cloud Gateway实践过程

《SpringBoot3整合SpringCloudGateway实践过程》本文介绍了如何使用SpringCloudAlibaba2023.0.0.0版本构建一个微服务网关,包括统一路由、限... 目录引子为什么需要微服务网关实践1.统一路由2.限流防刷3.登录鉴权小结引子当前微服务架构已成为中大型系统的标

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Java 8 Stream filter流式过滤器详解

《Java8Streamfilter流式过滤器详解》本文介绍了Java8的StreamAPI中的filter方法,展示了如何使用lambda表达式根据条件过滤流式数据,通过实际代码示例,展示了f... 目录引言 一.Java 8 Stream 的过滤器(filter)二.Java 8 的 filter、fi