• 【Java语言特性学习之五】Java基础API


    一、Unsafe类
    Java不能直接访问操作系统底层,而是通过native方法来访问。
    sun.misc.Unsafe类提供了硬件级别的原子操作:裸内存的申请/释放/访问,底层硬件的atomic/volatile支持,创建未初始化对象等,具体提供了82多个public native方法,通过调用底层C/C++来实现。
    一些高性能开发库都是基于Unsafe类开发,比如 Netty、Hadoop、Kafka。它原本的设计就只应该被标准库使用,因此不建议在生产环境中使用。
    1、获取Unsafe实例
    (1)Unsafe要求加载的类加载器必须是Bootstrap ClassLoader。
    Unsafe是一个final类,不能被继承,构造器是private,只能通过工厂方法getUnsafe获得Unsafe的单例。但是getUnsafe方法限制了调用该方法的类的类加载器必须为Bootstrap ClassLoader。

    (2)通过反射获取

    package test;
    
    public class Person {
        public static String NAME = "doge";
        public String age;
    }
    package test;
    
    import jdk.nashorn.internal.codegen.CompilerConstants;
    import sun.misc.Unsafe;
    
    import java.lang.reflect.Field;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            //根据反射获取属性
            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);//theUnsafe是private 这里设置可以访问
            Unsafe unsafe = (Unsafe) theUnsafe.get(null);//通过get获取对象强转
    
            Class<Person> personClass = Person.class;
            Field name = personClass.getField("NAME");
            Field age = personClass.getField("age");
            try {
                System.out.println("objectFieldOffset name -->" + unsafe.objectFieldOffset(name));//null
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            try {
                System.out.println("objectFieldOffset age -->" + unsafe.objectFieldOffset(age));//12
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            try {
                System.out.println("staticFieldOffset name -->" + unsafe.staticFieldOffset(name));//104
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
            try {
                System.out.println("staticFieldOffset age -->" + unsafe.staticFieldOffset(age));//null
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
    
        }
    }

    2、Unsafe功能分类

    二、Thread

    三、ThreadLocal

    参考:

     java native关键字

    Unsafe相关整理
    JAVA中神奇的双刃剑--Unsafe
    在openjdk8下看Unsafe源码

    jdk各个包 概述

  • 相关阅读:
    在Ubuntu下依然爱SOGO
    CompositePattern(23种设计模式之一)
    Arduino String.h库函数详解
    cp命令详解
    PHP AJAX 返回JSON 数据
    PHP AJAX返回 "TEXT"
    PHP JSON数据 AJAX
    PHP JQurey
    PHP 封装POD 类
    PHP 分页+查询
  • 原文地址:https://www.cnblogs.com/cac2020/p/12028783.html
Copyright © 2020-2023  润新知