java-并发-源码-Unsafe
unsagfe需要补充线程控制的部分
一. 实例化
方式1:运行时加入bootclasspath
java -Xbootclasspath:/usr/jdk1.7.0/jre/lib/rt.jar:. com.mishadoff.magic.UnsafeClient
方式2:反射
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
二. API
//直接访问内存
allocateMemory
copyMemory
freeMemory
getAddress
getInt
putInt
//返回一些低级的内存信息**
addressSize
pageSize
//提供用于操作对象及其字段的方法
allocateInstance
objectFieldOffset
//提供用于操作类及其静态字段的方法
staticFieldOffset
defineClass
defineAnonymousClass
ensureClassInitialized
//操作数组
arrayBaseOffset		//获取数组第一个元素偏移地址
arrayIndexScale		//可以获取数组的转换因子,即地址增量
//低级的同步原语
monitorEnter
tryMonitorEnter
monitorExit
compareAndSwapInt
putOrderedInt
park				//挂起当前线程
unpark				//恢复挂起的线程
compareAndSwapXXX	//CAS操作
三. 线程挂起与恢复
将一个线程进行挂起是通过park方法实现的,调用 park后,线程将一直阻塞直到超时或者中断等条件出现。
unpark可以终止一个挂起的线程,使其恢复正常。
封装到了LockSupport类,各种个版本的park都是调用unsafe.park()方法
四. 应用
绕过初始化
不会调用构造器
A o3 = (A)unsafe.allocateInstance(A.class);
内存崩溃
sizeOf
浅拷贝
隐藏密码
多继承
动态类
抛出受检异常
快速序列化
大数组
并发
http://ifeve.com/sun-misc-unsafe/
http://blog.csdn.net/fenglibing/article/details/17138079
http://blog.csdn.net/aesop_wubo/article/details/7537278
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号