【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

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并发编程(二)--j.u.c锁机制

AQS <span style="font-size: 10.5000pt; font-fami

Java中Unsafe类详解

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

【总结整理】J.U.C (一)

      java多线程体系主要以包 java.util.concurrent 构建。     api主要囊括了 原子操作,锁,并发容器,线程池四大块的内容,有此构成了java的多线程体系

点滴:Java 虚拟机详解

深入理解JVM 1   Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、J...

J.U.C学习之Condition的使用

//生产者消费者队列 public class ProductQueue&lt;T&gt; { private final T[] items; private final Lock lock = new ReentrantLock(); private Condition notFull = lock.newCondition(); private Condi

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

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

深入浅出 Java Concurrency (1) : J.U.C的整体认识

<p style="font-size: 13px; line-height: 19px; margin: 10px 0px; text-indent: 20px; color: #000000; font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; text-align: start; white-space: normal; background-color:

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

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

转 Java并发编程J.U.C之Condition

在上一篇中,我们了解了下<a style="color: #225588; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #dddddd;" href="http://www.goldendoc.org/2011/06/lo

Java-Unsafe类(一)

1、 sun.misc.Unsafe 提供了可随意查看及修改JVM中运行时的数据结构 2、import sun.misc.Unsafe; // Eclipse引入此行会出现错误提示, 解决方法: [...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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