package com.example.demo.util; /** * JDK的rt.jar包中Unsafe类提供了硬件级别的非阻塞(一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法)原子性操作, * Unsafe类中方法都是native方法,它们使用JNI的方式访问本地C++实现库。 * rt.jar包中的类都是通过BootStrap类加载器进行加载的。 * 在本类中获取Unsage类的实例只能通过反射获取。 * * 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的 * 线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐 * 观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就 * 重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap。 */ import java.lang.reflect.Field; import sun.misc.Unsafe; public class TestUnSafe { static final Unsafe unsafe;// = Unsafe.getUnsafe();抛出SecurityException static final long stateOffset; private volatile long state = 0;// 多线程下保证内存可见性 static { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe) field.get(null); stateOffset = unsafe.objectFieldOffset(TestUnSafe.class.getDeclaredField("state"));// 获取state变量在类中的偏移量 System.out.println("stateOffset=" + stateOffset); } catch (Exception e) { System.out.println(e.getLocalizedMessage()); throw new Error(e); } } public static void main(String[] args) { TestUnSafe test = new TestUnSafe(); Boolean success = unsafe.compareAndSwapInt(test, stateOffset, 0, 1);// CAS原子性操作,当前实例所在偏移量为stateOffset的内存位置值为0,则更新为1. System.out.println(success); System.out.println("state=" + test.state); } }
执行结果:
stateOffset=16 true state=1