Unsafe类简介
JUC中很多的实现都是调用了Unsafe类来实现的,所以这里阅读下该类的内容.
Unsafe类包装了很多低级别的非安全性操作.虽然该类及其所有的方法都是public的,但是它只能被受信任的代码使用(也就是jdk中的代码)
读源码过程中,这里只会对部分方法进行说明,其余的方法要么类似要么不那么重要.
读源码
//构造方法私有化private Unsafe() {}//采用饿汉式单例private static final Unsafe theUnsafe = new Unsafe();//获取实例对象public static Unsafe getUnsafe() { //获取调用该方法的调用者信息 Class<?> caller = Reflection.getCallerClass(); //判断该调用这的类加载器是否是系统类加载器(系统类加载器为null) if (!VM.isSystemDomainLoader(caller.getClassLoader())) throw new SecurityException("Unsafe"); return theUnsafe;}//返回一个静态字段的偏移量public native long staticFieldOffset(Field f);//返回一个非静态字段字段的偏移量public native long FieldOffset(Field f);//获取给定对象指定偏移量的int值public native int getInt( o, long offset);//把给定对象指定偏移量上的值设置为整型变量xpublic native void putInt( o, long offset, int x);//获取给定内存地址上的byte值public native byte getByte(long address);//把给定内存地址上的值设置为byte值xpublic native void putByte(long address, byte x);//获取给定内存地址上的值,该值是表示一个内存地址public native long getAddress(long address);//分配一块本地内存,这块内存的大小便是给定的大小.这块内存的值是没有被初始化的public native long allocateMemory(long bytes);//定义一个类public native Class<?> defineClass(String name, byte[] b, int off, int len, ClassLoader loader, ProtectionDomain protectionDomain);//定义一个匿名类public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, [] cpPatches);//获取给定对象上的锁(jvm中有monitorenter 和 monitorexit两个指令)public native void monitorEnter( o);//释放给定对象上的锁(jvm中有monitorenter 和 monitorexitpublic native void monitorExit( o);//CAS操作,修改对象指定偏移量上的(CAS简介见末尾)public final native boolean compareAndSwap ( o, long offset, expected, x);//CAS操作public final native boolean compareAndSwapInt( o, long offset, int expected, int x);//CAS操作public final native boolean compareAndSwapLong( o, long offset, long expected, long x);//获取被volatile关键字修饰的字段的值public native get Volatile( o, long offset);//取消阻塞线程 thread,如果 thread 已经是非阻塞状态,//那么下次对该 thread 进行park操作时就不会阻塞public native void unpark( thread);//阻塞当前线程,isAbsolute的作用不是很清楚.(如果该方法调用前在线程非阻塞情况下调用了unpart方法,那么此次调用该方法不会令当前线程阻塞)public native void park(boolean isAbsolute, long time);//CAS操作public final int getAndAddInt( o, long offset, int delta) { int v; do { v = getIntVolatile(o, offset); } while (!compareAndSwapInt(o, offset, v, v + delta)); return v;}CAS简介
CAS(Compare And Swap)比较并交换,是CPU级提供的功能.
比如IA64,X86指令集中就有cmpxchg指令来完成CAS功能
CAS指令需要3个操作数,分别是内存位置V,旧的预期值A,新值B. CAS指令执行时,当且仅当V符合旧的预期值A,处理器才用新值B更新V的值,否则部执行更新.最后无论是否更新V的值,都会返回V的旧值.CAS操作是一个原子操作. —参考<<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版) 周志明 著>> 第13章 线程安全与锁优化
欢迎关注订阅号:
继续阅读与本文标签相同的文章
上一篇 :
Class文件二进制分析
下一篇 :
读LockSupport源码
-
使用VUE实现textarea固定输入行数与添加下划线样式.
2026-06-02栏目: 教程
-
知识图谱论文大合集,这份干货满满的笔记解读值得收藏
2026-06-02栏目: 教程
-
从零开始搭建webpack+react开发环境
2026-06-02栏目: 教程
-
一起学习造轮子(二):从零开始写一个Redux
2026-06-02栏目: 教程
-
Thread &amp ExecutorService &amp ThreadPoolExecutor 总览
2026-06-02栏目: 教程
