ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

读Unsafe类源码

来源:网络整理     时间:2015-06-06     关键词:

本篇文章主要介绍了"读Unsafe类源码",主要涉及到方面的内容,对于Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: Unsafe类简介JUC中很多的实现都是调用了Unsafe类来实现的,所以这里阅读下该类的内容.Unsafe类包装了很多低级别的非安全性操作.虽然该类及其所有的...

Unsafe类简介

JUC中很多的实现都是调用了Unsafe类来实现的,所以这里阅读下该类的内容.

Unsafe类包装了很多低级别的非安全性操作.虽然该类及其所有的方法都是public的,但是它只能被受信任的代码使用(也就是jdk中的代码)

读源码过程中,这里只会对部分方法进行说明,其余的方法要么类似要么不那么重要.

读源码

//构造方法私有化privateUnsafe() {}
//采用饿汉式单例privatestaticfinal Unsafe theUnsafe = new Unsafe();

//获取实例对象publicstatic Unsafe getUnsafe() {
    //获取调用该方法的调用者信息
    Class caller = Reflection.getCallerClass();
    //判断该调用这的类加载器是否是系统类加载器(系统类加载器为null)if (!VM.isSystemDomainLoader(caller.getClassLoader()))
        thrownew SecurityException("Unsafe");
    return theUnsafe;
}

//返回一个静态字段的偏移量publicnativelongstaticFieldOffset(Field f);

//返回一个非静态字段字段的偏移量publicnativelongobjectFieldOffset(Field f);

//获取给定对象指定偏移量的int值publicnativeintgetInt(Object o, long offset);

//把给定对象指定偏移量上的值设置为整型变量xpublicnativevoidputInt(Object o, long offset, int x);

//获取给定内存地址上的byte值publicnativebytegetByte(long address);

//把给定内存地址上的值设置为byte值xpublicnativevoidputByte(long address, byte x);

//获取给定内存地址上的值,该值是表示一个内存地址publicnativelonggetAddress(long address);

//分配一块本地内存,这块内存的大小便是给定的大小.这块内存的值是没有被初始化的publicnativelongallocateMemory(long bytes);

//定义一个类publicnative Class defineClass(String name, byte[] b, int off, int len,
                                       ClassLoader loader,
                                       ProtectionDomain protectionDomain);

//定义一个匿名类publicnative Class defineAnonymousClass(Class hostClass, byte[] data, Object[] cpPatches);

//获取给定对象上的锁(jvm中有monitorenter 和 monitorexit两个指令)publicnativevoidmonitorEnter(Object o);

//释放给定对象上的锁(jvm中有monitorenter 和 monitorexitpublicnativevoidmonitorExit(Object o);

//CAS操作,修改对象指定偏移量上的(CAS简介见末尾)publicfinalnativebooleancompareAndSwapObject(Object o, long offset,
                                                 Object expected,
                                                 Object x);

//CAS操作publicfinalnativebooleancompareAndSwapInt(Object o, long offset,
                                                  int expected,
                                                  int x);

//CAS操作publicfinalnativebooleancompareAndSwapLong(Object o, long offset,
                                                   long expected,
                                                   long x);

//获取被volatile关键字修饰的字段的值publicnative Object getObjectVolatile(Object o, long offset);

//取消阻塞线程 thread,如果 thread 已经是非阻塞状态,//那么下次对该 thread 进行park操作时就不会阻塞publicnativevoidunpark(Object thread);

//阻塞当前线程,isAbsolute的作用不是很清楚.(如果该方法调用前在线程非阻塞情况下调用了unpart方法,那么此次调用该方法不会令当前线程阻塞)publicnativevoidpark(boolean isAbsolute, long time);

//CAS操作publicfinalintgetAndAddInt(Object o, long offset, int delta) {
        int v;
        do {
            v = getIntVolatile(o, offset);
        } while (!compareAndSwapInt(o, offset, v, v + delta));
        return v;
}

CAS简介

CAS(Compare And Swap)比较并交换,是CPU级提供的功能.

比如IA64,X86指令集中就有cmpxchg指令来完成CAS功能
CAS指令需要3个操作数,分别是内存位置V,旧的预期值A,新值B. CAS指令执行时,当且仅当V符合旧的预期值A,处理器才用新值B更新V的值,否则部执行更新.最后无论是否更新V的值,都会返回V的旧值.CAS操作是一个原子操作.    —参考<<深入理解java虚拟机:jvm高级特性与最佳实践(第二版) 周志明 着>> 第13章 线程安全与锁优化 

以上就介绍了读Unsafe类源码,包括了方面的内容,希望对Javajrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_140304.html

相关图片

相关文章