1. Unsafe介绍
Unsafe不是标准Jdk中的类,定义在sun.misc包中,可以用来直接访问内存;
Unsafe为单例模式,提供getUnsafe静态方法获取实例,但是getUnsafe方法只允许被启动类加载器(BootstrapClassLoader)加载的类调用,否则抛出SecurityException;
Unsafe作为单例类,用theUnsafe属性保存单例实例,通常可以通过反射的方式获取Unsafe实例;
2. API介绍
Unsafe类用来读写内存中的数据,有2中获取内存地址的形式:通过Unsafe直接分配内存,类或对象中属性的内存地址;
Unsafe类访问类或对象属性内存与属性的访问权限无关;
Unsafe类中的方法一般分为3类:
- 类及静态属性相关
- 对象及对象属性相关
- 数组相关
- 直接操作内存相关
- CAS原子操作相关
2.1 对象及对象属性
- long objectFieldOffset(Field field):获取对象属性的内存地址,内存地址值共put/get等方法使用
- getInt(Object object, long address):获取object对象address偏移地址上面的int类型的值
- getIntVolatile(Object object, long address):意义同2,附加volatile功能及从主内存取值
- putInt(Object object, long address, int value):设置对象object的address偏移地址的值为value
- putIntVoatile(Object object, long address, int value):意义同4,附加volatile功能及新值刷新到主内存
- putOrderedInt(Object object, long address, int value):意义同4,如果属性有volatile修饰,不保证直接刷新到主内存
- compareAndSwapInt(Object object, long address, int expectedValue,