并发

在openjdk8下看Unsafe源码

目录一、前言二、底层native方法(底层C++不拓展了)三、上层应用方法(调用了native方法实现) 正文尽管有传言JAVA9可能会移除Unsafe类,但不妨碍我们理解它的原理。因为类不在了,native方法还在那里。就像菜换样了,食材就那些没变。一个好厨师不仅仅需要会做菜,还需要能识别食材特性...来吧,直接上干货。注:强烈不建议程序中自己调用Unsafe类方法,这一点没有质疑。目

目录

 

正文

尽管有传言JAVA9可能会移除Unsafe类,但不妨碍我们理解它的原理。因为类不在了,native方法还在那里。就像菜换样了,食材就那些没变。一个好厨师不仅仅需要会做菜,还需要能识别食材特性...来吧,直接上干货。

注:强烈不建议程序中自己调用Unsafe类方法,这一点没有质疑。

目录

1.前言

2.Unsafe中的native方法

3.Unsafe中的上层方法

=======正文分割线======


一、前言

在JDK8中追踪可见sun.misc.Unsafe这个类是无法看见源码的,打开openjdk8源码看

目录:openjdk-8-src-b132-03_mar_2014\openjdk\jdk\src\share\classes\sun\misc

此类包含了低级(native硬件级别的原子操作)、不安全的操作集合。

获取Unsafe实例静态方法:

private Unsafe() {}

private static final Unsafe theUnsafe = new Unsafe();

@CallerSensitive
public static Unsafe getUnsafe() {
    Class<?> caller = Reflection.getCallerClass();
    if (!VM.isSystemDomainLoader(caller.getClassLoader()))
        throw new SecurityException("Unsafe");
    return theUnsafe;
}

二、底层native方法(底层C++不拓展了)

共计82个public native,下面列出了核心方法:

 //扩充内存  
    public native long reallocateMemory(long address, long bytes);  
      
    //分配内存  
    public native long allocateMemory(long bytes);  
      
    //释放内存  
    public native void freeMemory(long address);  
      
    //在给定的内存块中设置值  
    public native void setMemory(Object o, long offset, long bytes, byte value);  
      
    //从一个内存块拷贝到另一个内存块  
    public native void copyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes);  
      
    //获取值,不管java的访问限制,其他有类似的getInt,getDouble,getLong,getChar等等  
    public native Object getObject(Object o, long offset);  
      
    //设置值,不管java的访问限制,其他有类似的putInt,putDouble,putLong,putChar等等  
    public native void putObject(Object o, long offset);  
      
    //从一个给定的内存地址获取本地指针,如果不是alloc

原创不易,完成人机校验,阅读全文

相关推荐