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

posted @ 2016-09-02 21:16  zhangshihai1232  阅读(123)  评论(0)    收藏  举报