java中的Unsafe

作者: 美团Java | 来源:发表于2016-07-19 18:04 被阅读12468次

简书 占小狼
转载请注明原创出处,谢谢!

前言

Java最初被设计为一种安全的受控环境。尽管如此,HotSpot还是包含了一个后门sun.misc.Unsafe,提供了一些可以直接操控内存和线程的底层操作。Unsafe被JDK广泛应用于java.nio和并发包等实现中,这个不安全的类提供了一个观察HotSpot JVM内部结构并且可以对其进行修改,但是不建议在生产环境中使用。

如何使用

Unsafe类是如此地不安全,以至于JDK开发者增加了很多特殊限制来访问它。

  1. 私有的构造器
  2. 工厂方法getUnsafe()的调用器只能被Bootloader加载,否则抛出SecurityException 异常

不过,我们可以通过反射机制轻松获取Unsafe的一个实例。

public static Unsafe getUnsafe() {
   try {
           Field f = Unsafe.class.getDeclaredField("theUnsafe");
           f.setAccessible(true);
           return (Unsafe)f.get(null);
   } catch (Exception e) { 
       /* ... */
   }
}

一些有用的方法

  1. objectFieldOffset:能够获取到指定实例变量的在对象内存中的偏移量
long offset = UNSAFE.objectFieldOffset(UnsafeTest.class.getDeclaredField("state"));
  1. compareAndSwapInt:通过比较并替换的机制,修改指定偏移量内存的值
UNSAFE.compareAndSwapInt(unsafeTest, offset, 0, 1)
  1. park:挂起某一线程
  2. unpark:唤醒某一线程

未完...

END。
我是占小狼。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
读完我的文章有收获,记得关注和点赞哦,如果非要打赏,我也是不会拒绝的啦!

相关文章

  • java中的Unsafe

    简书 占小狼转载请注明原创出处,谢谢! 前言 Java最初被设计为一种安全的受控环境。尽管如此,HotSpot还是...

  • Java中的Unsafe

    Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和...

  • Java中的Unsafe

    简介 Java是一种安全的编程语言,可以防止程序员犯许多愚蠢的错误,其中大多数错误都是基于内存管理的。但是,有一种...

  • Java中的Unsafe

    https://www.jianshu.com/p/db8dce09232d[https://www.jiansh...

  • Java中的Unsafe

    Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和...

  • 【安卓逆向】Java中的魔术类

    简单谈一谈Java中的Unsafe类 Unsafe类是啥? Java最初被设计为一种安全的受控环境。尽管如此,Ja...

  • java 中Unsafe介绍

    Unsafe 是位于sun.misc包下的一个类,它可以让我们直接访问系统内存资源、自主管理内存资源等,这些方法在...

  • Unsafe 与 LockSupport

    1.Unsafe java concurrent 包的基础是CAS, 而进行CAS操作的就是这个 Unsafe类....

  • Java中如何分配以及释放直接内存

    Java中如何使用直接内存? 使用未公开的Unsafe 使用NIO的ByteBuffer或者DirectByteB...

  • Java Part 3: SecurityManager

    翻译自:securitymanager Intro 在 Java 中可以用 sun.misc.Unsafe 类为所...

网友评论

本文标题:java中的Unsafe

本文链接:https://www.haomeiwen.com/subject/sybmjttx.html