【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各个包 概述

posted @ 2019-12-12 14:01  cac2020  阅读(259)  评论(0编辑  收藏  举报