Unsafe类学习
在看Juc中AtomicInteger的源代码,发现里面用了一个类:Unsafe。之前没有接触过,这里就来瞅瞅。
从这个链接可以看到Unsafe的源代码,从注释可以看到:
这个类提供底层的操作并且应该用于可信的代码。字段可以通过内存直接读取(应该是直接控制JVM的内存了)。
同时可以看到,类以单例的方式提供实例。所有的方法都是native方法,引用具体的C代码实现。
下面看一下具体所提供的方法:
long objectFieldOffset(Field field);—>获取对象的中某字段的偏移地址
native long objectFieldOffset0(Field field);—>native方法,实现上述方法的功能
int arrayBaseOffset(Class clazz); —>获取数组的第一个对象的地址,clazz必须是array类
native int arrayBaseOffset0(Class clazz); —>native方法,实现上述方法的功能
int arrayIndexScale(Class clazz); —>获得数组中每个元素的大小,clazz必须是array类
native int arrayIndexScale0(Class clazz); —>native方法,实现上述方法
native boolean compareAndSwapInt(Object obj, long offset, int expectedValue, int newValue); —>对某个对象的int字段采用CAS操作
native boolean compareAndSwapLong(Object obj, long offset, long expectedValue, long newValue); —>对某个对象的long字段采用CAS操作
native boolean compareAndSwapObject(Object obj, long offset, Object expectedValue, Object newValue); —>对某个对象的Object字段采用CAS操作,这里比较的是对象的引用
native int getIntVolatile(Object obj, long offset); —>采用volatile语义获取对象的int字段(volatile应该是保证内存和缓存的数据一致)
native void putIntVolatile(Object obj, long offset, int newValue); —>采用volatile存放对象的int字段
native long getLongVolatile(Object obj, long offset); —>采用volatile语义获取对象的long字段
native void putLongVolatile(Object obj, long offset, long newValue); —>采用volatile语义存放对象的long字段
native Object getObjectVolatile(Object obj, long offset);—>采用volatile语义获取对象的object字段
native void putObjectVolatile(Object obj, long offset, Object newValue); —>采用volatile语义存放对象的object字段
—>下列方法功能与上面相同,不采用volatile语义,即不保证主存和缓存数据同步
native int getInt(Object obj, long offset);
native void putInt(Object obj, long offset, int newValue);
native long getLong(Object obj, long offset);
native void putLong(Object obj, long offset, long newValue);
native Object getObject(Object obj, long offset);
native void putObject(Object obj, long offset, Object newValue);
—>后面的两个方法还不完全明白,继续学习。搞清楚了在写
void park(boolean absolute, long time);
void unpark(Object obj);