从这个类的名字Unsafe
上来说这个类就是一个不安全的类,也是不开放给用户直接使用的(当然我们还是可以通过其他一些方法用到)。
这个类在jdk源码中多个类中用到,主要作用是任意内存地址位置处读写数据,外加一下CAS操作。它的大部分操作都是绕过JVM通过JNI完成的,因此它所分配的内存需要手动free,所以是非常危险的。但是Unsafe中很多(但不是所有)方法都很有用,且有些情况下,除了使用JNI,没有其他方法弄够完成同样的事情。
至于研究它的起因,是因为我最近在看jdk8的ConcurrentHashMap,这个版本的主要函数就是用过Unsafe来完成的。
Unsafe类的调用
Unsafe类是一个单例,调用的方法为getUnsafe
,如下。可以看到,虽然是可以调用,但是会有一步判断,判断是不是内部会检查该CallerClass是不是由系统类加载器BootstrapClassLoader
加载。由系统类加载器加载的类调用getClassLoader()
会返回null,所以要检查类是否为bootstrap加载器加载只需要检查该方法是不是返回null。
Read full article from Unsafe类初探 | 行走的轮子
No comments:
Post a Comment