这个方法的作用是用来获取指定对象的域的偏移量,这个是指这个字段在内存中的位置相对于这个对象在内存中的起始地址的偏移量,也就是隔了多远,有了这个值,后续就能直接定位到这个域的内存地址,然后获取其中的值去操作。注意,这个方法只适用于域为非static修饰的,static修饰的域需要使用Unsafe.staticFieldOffset()
Usage:
long offset = unsafe.objectFieldOffset(Field var) 方法结收一个java.lang.reflect.Field对象。
静态域的偏移量也是一样的使用,方法名不同。
Unsafe.compareAndSwapObject()以CAS的方式来更新一个引用类型的字段值,如果更新成功则返回true,否则返回false。
Usage:
boolean casResult = unsafe.compareAndSwapObject(object,offset,expected,update);这个方法本身不会有自旋行为,直接做CAS操作,如果失败立即返回。通常是我们在代码中通过无限循环实现CAS的自旋,并且需要被更新的域一般都是用volatile修饰的,不然多线程环境下无法保证正确性。
如果想通过此方式来CAS操作静态域的值,第一个参数为静态域所在的Class对象。
Unsafe.compareAndSwapInt()和上面的方法作用一样,只不过是用来操作int类型的变量
Unsafe.putOrderedInt()Unsafe.putIntVolatile()的有序版本/延迟版本,只保证最终将制定的变量更新为新的值。
Unsafe.getAndSetInt()这个不属于native方法,是用getIntVolatile 和compareAndSwapInt两个方法组合,对指定的变量设置为新的值,不过会返回设置新值前的旧值,而不是无条件直接设置,在竞争的条件下,这样就需要在循环中不断做CAS。
Unsafe.getAndAddInt()这个同样不属于native方法,和上面差不多,只不过是在旧值的基础上做了个加新值的操作