java unsafe类_java中一半是天使一半是魔鬼的Unsafe类详解

(5)CAS机制
下面我们对这些方法尽进行一个大致的分析 。
1、初始化
在这里我们看到的初始化方法主要是通过方法的单例模式实现的,调用JVM本地方法()和sun..,通过的判断当前调用的类是否是主类加载器( )加载的,否则的话抛出一个 。这也证明了一个问题,那就是只有由主类加载器( )加载的类才能调用这个类中的方法 。
2、操作属性方法
(1)( o, long );
通过给定的Java变量获取引用值 。这里实际上是获取一个Java对象o中,获取偏移地址为的属性的值,此方法可以突破修饰符的抑制,也就是无视、和修饰符 。类似的方法有、等等 。同理还有方法 。
(2)( o, long );
强制从主存中获取属性值 。类似的方法有、等等 。同理还有 。
(3)void ( o, long ,x);
设置o对象中偏移地址对应的型field的值为指定值x 。这是一个有序或者有延迟的方法,并且不保证值的改变被其他线程立即看到 。只有在field被修饰并且期望被修改的时候使用才会生效 。类似的方法有和 。
(4)long (Field f);
返回给定的静态属性在它的类的存储分配中的位置(偏移地址) 。
(5)long (Field f);
返回给定的非静态属性在它的类的存储分配中的位置(偏移地址) 。
(6)(Field f);
返回给定的静态属性的位置,配合方法使用 。
3、操作数组
(1)int (Class );
返回数组类型的第一个元素的偏移地址(基础偏移地址) 。
(2)int (Class );
返回数组中元素与元素之间的偏移地址的增量 。
这两个方法配合使用就可以定位到任何一个元素的地址 。
4、内存管理
(1)int ();
获取本地指针的大小(单位是byte),通常值为4或者8 。常量就是调用此方法 。
(2)int ();
获取本地内存的页数,此值为2的幂次方 。
(3)long (long bytes);
分配一块新的本地内存,通过bytes指定内存块的大小(单位是byte),返回新开辟的内存的地址 。
(4)long (long , long bytes);
通过指定的内存地址重新调整本地内存块的大小,调整后的内存块大小通过bytes指定(单位为byte) 。
【java unsafe类_java中一半是天使一半是魔鬼的Unsafe类详解】(5)void ( o, long , long bytes, byte value);
将给定内存块中的所有字节设置为固定值(通常是0) 。
5、线程挂起和恢复
(1)void ( );
释放被park创建的在一个线程上的阻塞 。由于其不安全性,因此必须保证线程是存活的 。
(2)void park( , long time);`
阻塞当前线程,一直等道方法被调用 。
6、内存屏障
(1)void ();
在该方法之前的所有读操作,一定在load屏障之前执行完成 。
(2)void ();
在该方法之前的所有写操作,一定在store屏障之前执行完成
(3)void ();
在该方法之前的所有读写操作,一定在full屏障之前执行完成,这个内存屏障相当于上面两个(load屏障和store屏障)的合体功能 。
7、CAS机制
这个类其实是贯穿到整个java并发包体系中的,不管是你看原子包还是lock包底部都有这样的一个类,我们需要记住的不是每一个方法,而是上面七类的标题 。也就是具体有什么功能 。
三、使用
说了这么久的源码在这里才介绍其使用,是因为官方并不推荐我们使用,也就是说我们无法直接new出来一个类出来,那我们该如何使用呢?在很久之前我曾写过一篇介绍java反射机制的文章,没错就是这个反射机制,牛的不行 。就可以通过反射机制来获取 。
在这里只是给出一些简单的例子,其用法可以参照源码分析中那七个方向 。
仔细阅读jdk的源码有时候真的可以收获一些意想不到的东西 。感谢大家支持 。