`

Unsafe类的使用

    博客分类:
  • java
阅读更多

一,简介

       Unsafe可以用于获取成员字段在类实例中的偏移量,直接操作变量在主内存中的值等操作。
       1,获取
unsafe.objectFieldOffset(Field f)成员变量地址偏移量。

public class AtomicInteger extends Number implements java.io.Serializable {
    private static final long serialVersionUID = 6214790243416807050L;

    // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

    static {
      try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));//获取该字段的偏移量
      } catch (Exception ex) { throw new Error(ex); }
    }

    private volatile int value;//成员字段

    /**
     * Creates a new AtomicInteger with the given initial value.
     *
     * @param initialValue the initial value
     */
    public AtomicInteger(int initialValue) {
        value = initialValue;
    }
}
    2,根据字段偏移量获取实例中此字段的值。

 

  long offset = unsafe.objectFieldOffset(User.class.getDeclaredField("age"));
  Object obj = unsafe.getInt(this, offset);//获取int型值,getObject(),getLong()等
  System.out.println(obj);
   3,CAS算法支持
public class AtomicBoolean implements java.io.Serializable {

    /**
     * Atomically sets the value to the given updated value
     * if the current value {@code ==} the expected value.
     *
     * @param expect the expected value
     * @param update the new value
     * @return true if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);//如果主内存中的值是期望
        //的e则替换成u并返回true,否则返回false。
    }
}
   4,获取Unsafe实例
/**import sun.misc.Unsafe;导入此包
 * 反射获取该实例,还绕开了安全管理器的限制
 */
private static Unsafe getUnsafeInstance() throws SecurityException,
NoSuchFieldException, IllegalArgumentException, IllegalAccessException
{
    Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
    theUnsafeInstance.setAccessible(true);
    return (Unsafe) theUnsafeInstance.get(Unsafe.class);//返回指定对象上此Field字段表示的值
 }
 
二,总结
    Unsafe提供了直接操作主内存(堆内存)的方法,但sun公司是通过安全管理器限制了直接获取Unsafe的,毕竟应用层直接操作主内存是不安全的,当然也是不允许的。更多关于Unsafe类的应用,请阅读JDK中原子类的实现。
分享到:
评论

相关推荐

    JDK8中sun.misc下UnSafe类源代码 UnSafe.java

    《深入解析JDK8中的sun.misc.UnSafe类》 在Java编程中,sun.misc.UnSafe类是一个非常特殊的存在。这个类在JDK8中扮演着一个核心的角色,它提供了对Java语言规范中未公开的底层操作的访问。尽管UnSafe类并非设计为...

    Java Unsafe类的使用.docx

    总的来说,Java的Unsafe类虽然强大且高效,但其内部操作直接触及JVM的底层,使用不当可能会引发安全问题,因此在实际开发中应谨慎使用,通常只在对性能有极致追求或者需要自定义高级并发数据结构时考虑。理解并恰当...

    JDK Unsafe 源码注释

    虽然Oracle发行的JDK版本不包含Unsafe的源代码,但在并发编程中,Unsafe类为java.util.concurrent包里的类提供了底层支持,例如通过提供绕过JVM直接修改内存的能力和使用硬件CPU指令实现CAS(Compare-And-Swap)原子...

    JDK8中sun.misc包下的UnSafe类

    JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com

    一篇看懂Java中的Unsafe类

    1. **实例化私有类**:通过反射获取`Unsafe`的实例,并使用`allocateInstance()`方法实例化私有构造器的类。这允许开发者绕过Java的正常构造器机制。 ```java Field f = Unsafe.class.getDeclaredField("theUnsafe...

    Java Unsafe类1

    Java中的`Unsafe`类是一个非常特殊且强大的工具...在实际开发中,除非有特殊需求,否则通常应优先选择Java提供的安全并发机制,如`synchronized`关键字、`java.util.concurrent`包中的工具类,而不是直接使用`Unsafe`。

    unsafe:使用sun.misc.Unsafe的各种Java类

    这个Unsafe类允许直接访问JVM中的内存,这是非常危险的,但是很有趣:)。 unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不...

    sun.misc.Unsafe源码

    5. **类加载和初始化**:`Unsafe`还可以参与类的加载和初始化过程,例如`defineClass`方法可以用来动态定义类,这在某些自定义类加载器的实现中可能用到。 6. **线程和运行时系统交互**:`Unsafe`还提供了与JVM运行...

    CS使用Unsafe的方法向DLL传参

    在C#中处理这类问题时,通常需要使用到`unsafe`关键字。这是因为默认情况下,C#是一种托管语言,它对指针操作进行了限制以增强安全性。然而,当需要与非托管代码交互时(如调用C/C++ DLL),就必须采用非托管的方式...

    探秘Java并发:Atomic&Unsafe的强大魔法

    本文深入解析Java并发编程中的两个关键类:Atomic和Unsafe。...风险与挑战:文中也强调了使用这些高级特性时的风险和挑战,特别是Unsafe类的使用,需要特别注意以避免潜在的安全问题和稳定性影响。

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    由于Unsafe类直接操作内存和线程调度,使用时需要格外小心,因为它绕过了Java的类型安全检查,可能导致不可预料的问题。 Java原子类大部分是基于CAS和volatile实现的。volatile关键字保证了变量的可见性,即一个...

    Unsafe_jdk1.5_rt.jar

    《深入理解Java Unsafe类在JDK 1.5中的应用》 在Java编程语言中,`Unsafe`类是一个特殊的存在,它提供了对内存操作的直接访问权限,绕过了Java的一些安全机制。在JDK 1.5版本的`rt.jar`库中,`Unsafe`类扮演着一个...

    简单谈一谈Java中的Unsafe类

    虽然官方不推荐在常规开发中使用,但`Unsafe`类在某些高性能和低延迟的应用场景中扮演着重要角色。以下是关于`Unsafe`类的一些关键知识点: 1. **内存管理**: - `allocateMemory`:动态分配内存,不需通过Java的`...

    Java并发编程学习之Unsafe类与LockSupport类源码详析

    总结,理解Unsafe类和LockSupport类的源码有助于深入掌握Java并发编程的底层机制,但使用时需谨慎,避免不必要的安全问题和性能开销。在实际开发中,更多地应该利用Java提供的高抽象层次的并发工具,如synchronized...

    java魔法类:Unsafe应用

    java魔法类:Unsafe应用

    Java Unsafe类实现原理及测试代码

    由于其强大的能力,`Unsafe`类能够执行一些常规Java API无法完成的任务,但也正因为这种能力,它也可能带来安全隐患,因此不推荐在常规编程中使用。 一、内存管理 `Unsafe`类提供了内存分配、释放以及内存拷贝等...

    Java并发编程之LockSupport、Unsafe详解.docx

    由于其潜在的风险,Unsafe类的使用受到限制,一般情况下,开发者不能直接实例化它,而是通过`Unsafe.getUnsafe()`静态方法获取。这个方法检查调用者的类加载器是否为系统域加载器,只有在满足条件的情况下才返回`...

    UnsafeAdapter:一个工具包,用于协助使用Java Unsafe类来分配和管理本地堆外内存块

    `Unsafe`类位于`sun.misc`包下,不是Java标准API的一部分,因此它的使用可能会引起兼容性问题。这个类提供了一些底层操作,比如直接内存分配、对象字段访问和内存屏障等。由于它的强大功能,如果不小心使用,可能...

    JUC基石——Unsafe类

    《JUC基石——Unsafe类详解》 在Java并发编程领域,`Unsafe`类扮演着一个特殊的角色,尽管它被标记为“不安全”,但却是Java并发库(JUC)中的重要基石,尤其在高并发场景下,如`ConcurrentHashMap`、`Atomic`系列...

    Java中的魔法类:sun.misc.Unsafe示例详解

    本文将深入探讨`Unsafe`类的一些关键特性、使用方法以及它在特定场景下的应用。 1. **Unsafe API概述** - **信息相关**:`addressSize()`和`pageSize()`等方法提供了与硬件相关的内存信息。 - **对象相关**:`...

Global site tag (gtag.js) - Google Analytics