java.util.concurrent 包下很多类的实现用到了基于硬件的CAS算法, 不再使用synchronized关键来进行并发控制,查看相关的源码后会发现最后都指向了一个类 ,这就是SUN未开源的sun.misc.Unsafe的类,该类功能很强大,涉及到类加载机制,其实例一般情况是获取不到的。还好有个反射的机制可以变通下,因为JVM 加载rt.jar时已经加载了该类,并且初始化过。上代码
/*
* 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
注:j2sdk1.4.2_09 中compareAndSwapInt没提供,貌似1.5以上才有
bea的 jrockit81sp6_142_10中有,用到了jrockit.vm包中的Memory
分享到:
相关推荐
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
sun.misc.Unsafe源码文件,需要学习的带走。希望能够帮助到大家。
最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...
sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...
sun.misc.BASE64Decoder.jar 绿色版 官方版本自己打包好的,可以直接调用,欢迎下载
JDK8中sun.misc下UnSafe类源代码 UnSafe.java JDK8中sun.misc下UnSafe类源代码 UnSafe.java
sun.misc.BASE64Encoder找不到jar包的解决方法? 在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示: Access restriction: The type BASE64Decoder is not ...
sun.misc.BASE64Encoder源码及jar包
安装了JDK 9以上版本,发现sun.misc.Base64Encoder和sun.misc.Base64Decoder无法使用。找不到导入的包此时将下面的包导入libs中就可以了
sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar sun.misc.BASE64Decoder.jar
sun.misc.BASEDecoder、sun.misc.BASEEncoder等 在编码解码是用到的工具类,导入jar包之后,就可以正常使用此类
java开发 sun.misc.BASE64Decoder.jar包下载 java开发 sun.misc.BASE64Decoder.jar包下载
sun.misc.BASE64Encoder找不到jar包,就导入sun.misc.BASE64Decoder.jar 封装好的jar包,无需再导入jre系统库了
如名,就是java 的sun.misc.BASE64Decoder.jar 包。 其实是已经过时的东西,因为java8推出了新的库来替代它,且android也有内置的base64相关的工具库。 但是,总有一些工程是要用老库的,也没办法(懒或者烦)更新...
Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的。...下面这篇文章主要给大家介绍了关于Java中魔法类:sun.misc.Unsafe的相关资料,需要的朋友可以参考下
Base64算法的加密解密都是使用sun.misc包下的BASE64Encoder及BASE64Decoder来进行的,例如Base64 和 Base64URL等需要依赖它
unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...
1.包含 sun.misc.BASE64加解密源码和jar【源码仅仅几个类而已】 2.完整的sun.misc.BASE64类【直接项目引用即可】
放心下载
找不到sun.misc.BASE64Encoder 时,导入bcprov-ext-jdk15on-149.jar包就行