【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
参考:
学习技术不是用来写HelloWorld和Demo的,而是要用来解决线上系统的真实问题的.