`

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中原子类的实现。
分享到:
评论

相关推荐

    Java Unsafe类的使用.docx

    CAS算法的出现使得在不使用synchronize这种“悲观锁”依然可以实现数据的安全访问,CAS算法是指先读取要修改的变量值,对它进行计算,然后执行检查并更新这个步骤(更新前判断那个值是否是之前那个读到的值),检查...

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

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

    JDK8中sun.misc包下的UnSafe类

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

    Java Unsafe类1

    Java Unsafe类1

    一篇看懂Java中的Unsafe类

    在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧

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

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

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

    过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有。Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了。 Unsafe类提供了以下这些功能: 一、内存管理。包括...

    JDK Unsafe 源码注释

    并发作为 Java 中非常重要的一部分,其内部大量使用了 Unsafe 类,它为 java.util.concurrent 包中的类提供了底层支持。

    简单谈一谈Java中的Unsafe类

    其实Java官方不推荐使用Unsafe类,因为官方认为,这个类别人很难正确使用,非正确使用会给JVM带来致命错误。但还是要会使用,下面这篇文章就来给大家简单的谈一谈关于Java中Unsafe类的相关资料,需要的朋友可以参考...

    java魔法类:Unsafe应用

    java魔法类:Unsafe应用

    JUC基石——Unsafe类

    我们经常在JUC包下的ConcurrentHashMap、Atomic开头的原子操作类、AQS以及LockSupport里面看到Unsafe类的身影,这个Unsafe类究竟是干什么的,本文可以带着读者一探究竟。 Java和C++、C语言的一个重要区别,就是Java...

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

    主要给大家介绍了关于Java并发编程学习之Unsafe类与LockSupport类源码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧

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

    不安全适配器一个工具包,用于协助使用Java Unsafe类来分配和管理本地堆外内存块。

    Java为什么会引入及如何使用Unsafe

    在Java9中,为了提高JVM的可维护性,Unsafe和许多其他的东西一起都被作为内部使用类隐藏起来了。但是究竟是什么取代Unsafe不得而知,个人推测会有不止一样来取代它,那么问题来了,到底为什么要使用Unsafe?  做...

    Memory.Unsafe:使用非托管内存和指针的不安全方法

    内存不安全 以完全通用的非类型安全方式使用指针和非托管内存的不安全方法。 NuGet 当前的NuGet软件包名称为DotNetCross....Unsafe类现在已添加到.NET Core中,并作为单独的程序包存在: 如有疑问,请使用此官方软件

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

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

    UnsafeMe:java中Unsafe类的Protopye使用

    不安全的我 使用关键但非常快的序列化对象的简单库。 使用这部进行解释。 ##Warning 这个库是一个... 原因很简单:Unsafe 类的任何错误都不会导致异常,而是会导致 VM 崩溃! 使用风险自负。 ##许可证麻省理工学院

    Unsafe.java

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

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

    Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的...如果你想搞破坏,可以使用Unsafe这个类。下面这篇文章主要给大家介绍了关于Java中魔法类:sun.misc.Unsafe的相关资料,需要的朋友可以参考下

    Java中LockSupport的使用.docx

    LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁...根据LockSupport 源码发现LockSupport的核心方法都是基于大名鼎鼎的sun.misc.Unsafe类中的park和unpark实现的。

Global site tag (gtag.js) - Google Analytics