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

未完...待续

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

相关文章推荐

AtomicInteger、Unsafe类、ABA问题

AtomicInteger原子类的底层实现

java Unsafe类中compareAndSwap相关介绍

最近在看jdk7中java.util.concurrent下面的源码中,发现许多类中使用了Unsafe类中的方法来保证并发的安全性,而java 7 api中并没有这个类的相关介绍,在网上查了许多资料,...
  • sherld
  • sherld
  • 2015-01-07 14:33
  • 2332

读Unsafe类源码

Unsafe类简介JUC中很多的实现都是调用了Unsafe类来实现的,所以这里阅读下该类的内容.Unsafe类包装了很多低级别的非安全性操作.虽然该类及其所有的方法都是public的,但是它只能被受信...

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

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

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

http://blog.csdn.net/javazejian/article/details/72772470  出自【zejian的博客】 关联文章: 深入理解Java类型信息(...

【Java并发编程实战】—–Unsafe类

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

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

Java中的指针有你看不到的一面。
  • xinaij
  • xinaij
  • 2015-11-25 16:25
  • 1314

sun.misc.unsafe类的使用

这个帖子是关于JAVA中鲜为人知的特性的后续更新,如果想得到下次在线讨论的更新,请通过邮件订阅,并且不要忘了在评论区留下你的意见和建议。     Java是一个安全的开发工具,它阻止...

Unsafe类compareAndSwapInt返回值

不聊闲,直接上代码 1、代码 package com.wenc.keywords; import java.lang.reflect.Field; import java.util.concur...

sun.misc.unsafe类的使用

原文链接: http://blog.csdn.net/fenglibing/article/details/17138079 这个帖子是关于JAVA中鲜为人知的特性的后续更新,如果想得到下次在线讨论...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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