J.U.C里常用到了Unsafe类资源汇总

原创 2013年12月06日 11:30:49

Unsafe功能介绍:

1: 访问并并设置对象特定位置的值,即使值是private的,依然可以访问到

private static class Node<E> {
        volatile E item;
        volatile Node<E> next;

        private static final sun.misc.Unsafe UNSAFE;
        private static final long itemOffset;
        private static final long nextOffset;


        static {
            try {
                UNSAFE = sun.misc.Unsafe.getUnsafe();
                Class k = Node.class;
                itemOffset = UNSAFE.objectFieldOffset
                    (k.getDeclaredField("item"));
                nextOffset = UNSAFE.objectFieldOffset
                    (k.getDeclaredField("next")); //通过类反射机制用成员变量的名字获取取对应的field ,
                                                  //然后再通过field来获取field在class中的偏移量
            } catch (Exception e) {
                throw new Error(e);
            }
        }
    }


  注:java 类的反射机制是一种不安全且耗时的操作,如无必要请不要使用


 2:cas 操作,non-blocking算法(非阻塞算法)的基础 

    

    /**
     * Atomically update Java variable to <tt>x</tt> if it is currently
     * holding <tt>expected</tt>.
     * @return <tt>true</tt> if successful
     */
    public final native boolean compareAndSwapObject(Object o, long offset,
                                                     Object expected,
                                                     Object x);

    /**
     * Atomically update Java variable to <tt>x</tt> if it is currently
     * holding <tt>expected</tt>.
     * @return <tt>true</tt> if successful
     */
    public final native boolean compareAndSwapInt(Object o, long offset,
                                                  int expected,
                                                  int x);

CompareAndSwapInt在 jvm的内部实现:

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
  UnsafeWrapper("Unsafe_CompareAndSwapInt");
  oop p = JNIHandles::resolve(obj);
  jint* addr = (jint *) index_oop_from_field_offset_long(p, offset);
  return (jint)(Atomic::cmpxchg(x, addr, e)) == e;
UNSAFE_END

Atomic::cmpxchg(x, addr, e)也是一个原子操作,通过比较缓存中的值与内存中的值是否相同来决定是否对其值进行更新

 通常的用法是将其包含在循环中:可参考java atomicInteger源码

    public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }


Unsafe功能调用实践:

 可参考:http://jackycheng2007.iteye.com/blog/1473464


如果相查看Unsafe源码:可以下载开源的openJDK源码,在目录openjdk/jdk/src/share/classes是所有的java api源码

在openjdk/jdk/src/share/classes/sun/misc下可以查看源码。大部分功能都是native 方法



参考:

 http://blog.csdn.net/aesop_wubo/article/details/7537278

未完...待续

版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA并发编程学习笔记之Unsafe类

原文地址:http://blog.csdn.net/aesop_wubo/article/details/7537278?reload java不能直接访问操作系统底层,而是通过本地方法来访问。Uns...

聊聊序列化(二)使用sun.misc.Unsafe绕过new机制来创建Java对象

在序列化的问题域里面有一个常见的问题,就是反序列化时用何种方式来创建Java对象,因为反序列化的目的是把一段二进制流转化成一个对象。 在Java里面创建对象有几种方式: 1. 显式地调用new语句...
  • ITer_ZC
  • ITer_ZC
  • 2014年11月05日 11:59
  • 3167

Java并发编程-无锁CAS与Unsafe类及其并发包Atomic

在前面一篇博文中,我们曾经详谈过有锁并发的典型代表synchronized关键字,通过该关键字可以控制并发执行过程中有且只有一个线程可以访问共享资源,其原理是通过当前线程持有当前对象锁,从而拥有访问权...

Java中Unsafe类详解

java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1、通过Unsafe类可以分配内存,可以释放内存; 类中提供的3个本地方法a...

【JAVA笔记——道】JAVA内存操作 sun.misc.Unsafe类

TIP:这是一个很危险的类,不熟悉情况下别用于生产环境我们知道JAVA作为高级语言的重要创新一点就是在于JVM的内存管理功能,这完全区别于C语言开发过程中需要对变量的内存分配小心控制,JVM很大程度解...

JAVA并发编程学习笔记之Unsafe类

java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1、通过Unsafe类可以分配内存,可以释放内存; 类中提供的3个本地方法a...
  • novelly
  • novelly
  • 2013年11月13日 17:49
  • 532

Java中Unsafe类

[原文地址:http://aswang.iteye.com/blog/1741871] 在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以...

Java。UnSafe类

java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1、通过Unsafe类可以分配内存,可以释放内存; 类中提供的3个本...

Unsafe类

今天读到AtomicInteger类源码时,发现它内部持有一个Unsafe类的实例,于是想点开去看源码,结果没有点开,上网一查,才知道原来这个类是JAVA中的一个后门,用来对内存进行操作,我想正是因为...

【实战Java高并发程序设计 1】Java中的指针:Unsafe类

Java中的指针有你看不到的一面。
  • xinaij
  • xinaij
  • 2015年11月25日 16:25
  • 1562
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J.U.C里常用到了Unsafe类资源汇总
举报原因:
原因补充:

(最多只允许输入30个字)