Unsafe是java操作内存的一个非安全类,操作对象和对应的变量来完成CAS操作
1.常用方法compareAndSwapInt是判断当前值与需要更改的值是否一致不一致则进行更改,属于原子操作,其对应的入参描述
Unsafe.compareAndSwapInt(Object var1, long var2, int var4, int var5)
(1)var1是传入的对象
(2)var2是便宜量,根据偏移量计算哪个值需要更改,一般一个class类默认开头占8个字节,然后每个int会占4个字节,这个偏移量一般为12或者16获取其它字节数字段,偏移量的获取一般使用
objectFieldOffset(Field var1)默认方法获取,然后进行值得更改。
(3)var4是当前期望值,这个值与当前值是否一致也会影响更改。
(4)var5是更改后的值,当判断对应类与对应的偏移量的变量和当前期望值一致时就会进行变量值得更改。
测试类如下
package com.java.memory;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class MemoryTes {
public static void main(String[] args) throws Exception {
Vo vo= new Vo();
Vo vo2= new Vo();
System.out.println(vo.hashCode());
System.out.println(vo2.hashCode());
Unsafe unsafe = geyUnsafeInstance();
long aoffset = unsafe.objectFieldOffset(Vo.class.getDeclaredField("a"));
long boffset = unsafe.objectFieldOffset(Vo.class.getDeclaredField("b"));
System.out.println(aoffset);
System.out.println(boffset);
// System.out.println(unsafe.getInt(vo,11));
// System.out.println(unsafe.getInt(vo2,16));
System.out.println(unsafe.compareAndSwapInt(vo,boffset,0,1));
System.out.println(vo.b);
}
public static Unsafe geyUnsafeInstance() throws Exception{
Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeInstance.setAccessible(true);
return (Unsafe) theUnsafeInstance.get(Unsafe.class);
}
}
测试后运行的结果如下,对b的值进行了更改,判断是更改的哪个字段是根据偏移量来计算的
对应的Vo类
package com.java.memory;
public class Vo {
int a;
int b;
}