JDK中的rt.jar包中Unsafe类使用demo

 

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

 

上一篇:ThreadLocalRandom 安全吗


下一篇:CAS乐观锁(原子操作)