sun.misc.Unsafe实例介绍
来源:互联网 发布:超星尔雅网络课程机刷 编辑:程序博客网 时间:2024/06/08 06:11
java.util.concurrent 包下很多类的实现用到了基于硬件的CAS算法, 不再使用synchronized关键来进行并发控制,查看相关的源码后会发现最后都指向了一个类 ,这就是SUN未开源的sun.misc.Unsafe的类,该类功能很强大,涉及到类加载机制,其实例一般情况是获取不到的。还好有个反射的机制可以变通下,因为JVM 加载rt.jar时已经加载了该类,并且初始化过。上代码
搞个测试类玩玩
运行测试案例
结果
2010-12-23 16:59:56:352 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:29) - fieldName:fieldOffset
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - byteParam:36
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - charParam:32
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - shorteParam:34
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - intParam:24
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - intParam2:28
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - longParam:8
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - doubleParam:16
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - strParam:40
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - strParam2:44
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:40) - true
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:42) - false
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:44) - true
转载地址:http://xiao-jiang51.iteye.com/blog/850413
/* * Copyright 2010, the original author or authors. All rights reserved. */package com.api;import java.lang.reflect.Field;import org.apache.log4j.Logger;import sun.misc.Unsafe;/** * 获取{@link sun.misc.Unsafe}实例<br> * 从rt.jar包中反编译该类获取的信息 * * <pre> * * package sun.misc; * * import java.lang.reflect.Field; * import java.lang.reflect.Modifier; * import java.security.ProtectionDomain; * import sun.reflect.Reflection; * * public final class Unsafe * { * private static final Unsafe theUnsafe; * public static final int INVALID_FIELD_OFFSET = -1; * * private static native void registerNatives(); * * public static Unsafe getUnsafe() * { * Class localClass = Reflection.getCallerClass(2); * if (localClass.getClassLoader() != null) * throw new SecurityException("Unsafe"); * return theUnsafe; * } * static * { * registerNatives(); * * theUnsafe = new Unsafe(); * } * .......................... * </pre> * * @author <a href="mailto:xiao_jiang51@163.com">xiao jiang</a> * @version %I%, %G% * @history 2010-12-23 */public class UnsafeSupport { private static Logger log = Logger.getLogger(UnsafeSupport.class); private static Unsafe unsafe; static { Field field; try { // 由反编译Unsafe类获得的信息 field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); // 获取静态属性,Unsafe在启动JVM时随rt.jar装载 unsafe = (Unsafe) field.get(null); } catch (Exception e) { log.error("Get Unsafe instance occur error", e); } } /** * 获取{@link Unsafe } */ public static Unsafe getInstance() { return unsafe; } public static void main(String[] args) { }}
搞个测试类玩玩
/* * Copyright 2010, the original author or authors. All rights reserved. */package com.api;/** * 分析目标 * * @author <a href="mailto:xiao_jiang51@163.com">xiao jiang</a> * @version %I%, %G% * @history 2010-12-23 */public class AnalyzedTarget { private byte byteParam; private char charParam; private short shorteParam; private int intParam; private int intParam2; private long longParam; private double doubleParam; private String strParam; private String strParam2; }
运行测试案例
/* *Copyright 2010, the original author or authors. All rights reserved. */package com.api;import java.lang.reflect.Field;import org.apache.log4j.Logger;import sun.misc.Unsafe;/** * 通过反射获取rt.jar下的Unsafe类 * * @author <a href="mailto:xiao_jiang51@163.com">xiao jiang</a> * @version %I%, %G% * @history 2010-12-23 */public class UnsafeTest { private static Logger log = Logger.getLogger(UnsafeTest.class); public static void main(String[] args) { Unsafe unsafe = UnsafeSupport.getInstance(); // 这个很牛 // unsafe.allocateMemory(1000000000l); Class clazz = AnalyzedTarget.class; Field[] fields = clazz.getDeclaredFields(); log.info("fieldName:fieldOffset"); // 获取属性偏移量,可以通过这个偏移量给属性设置 for (Field f : fields) { log.info(f.getName() + ":" + unsafe.objectFieldOffset(f)); } // arg0, arg1, arg2, arg3 分别是目标对象实例,目标对象属性偏移量,当前预期值,要设的值 // unsafe.compareAndSwapInt(arg0, arg1, arg2, arg3) AnalyzedTarget target = new AnalyzedTarget(); // 偏移量编译后一般不会变的,intParam这个属性的偏移量 long intParamOffset = 24; // 给它设置,返回true表明设置成功, 基于有名的CAS算法的方法,并发包用这个方法很多 log.info(unsafe.compareAndSwapInt(target, intParamOffset, 0, 3)); //比较失败 log.info(unsafe.compareAndSwapInt(target, intParamOffset, 0, 10)); //验证下上面是否设置成功,应该还是3,返回ture说明上面没该 log.info(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10)); }}
结果
2010-12-23 16:59:56:352 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:29) - fieldName:fieldOffset
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - byteParam:36
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - charParam:32
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - shorteParam:34
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - intParam:24
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - intParam2:28
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - longParam:8
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - doubleParam:16
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - strParam:40
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:32) - strParam2:44
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:40) - true
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:42) - false
2010-12-23 16:59:56:368 [INFO] com.api.UnsafeTest.main(UnsafeTest.java:44) - true
转载地址:http://xiao-jiang51.iteye.com/blog/850413
- sun.misc.Unsafe实例介绍
- sun.misc.Unsafe
- sun.misc.Unsafe
- sun.misc.Unsafe
- sun.misc.Unsafe源码
- sun.misc.Unsafe
- sun.misc.Unsafe源代码
- 认识 sun.misc.Unsafe
- Java sun.misc.Unsafe
- 使用sun.misc.Unsafe
- sun.misc.Unsafe
- Java中的sun.misc.Unsafe
- sun.misc.Unsafe's APIs
- sun.misc.Unsafe源码解析
- CAS与sun.misc.Unsafe
- 简单了解sun.misc.Unsafe
- sun.misc.Unsafe的理解
- sun.misc.Unsafe类详解
- ARM编程进阶之一 —— ARM汇编伪指令
- 关于ANDROID网络的类库
- 多进程与多线程(七)
- 秋叶推荐与点评:《P道理-ERP项目实施手记》
- ORACLE PL/SQL编程之:把触发器说透
- sun.misc.Unsafe实例介绍
- ARM编程进阶之二 —— ATPCS与混合编程
- Android进程间通讯之初见(IPC,RPC,LPC,BINDER,AIDL..)
- java实现插入排序
- 关于Oracle数据和对象的导入导出
- 有点纠结
- 去掉新版google reader上方空白 fix Google Reader white space
- Java关键字final、static使用总结
- ping and telnet