关于Unsafe中的compareAndSwap方法实例_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于Unsafe中的compareAndSwap方法实例

关于Unsafe中的compareAndSwap方法实例

 2018/5/7 18:56:34  fuhuijun  程序员俱乐部  我要评论(0)
  • 摘要:importjava.lang.reflect.Field;importsun.misc.Unsafe;/***@authorfhj*@date2018年5月7日下午4:16:21*@version<b>1.0.0</b>*/publicclassCompareAndSwap{privatestaticfinalUnsafeunsafe;privatestaticfinallongfieldOffset;static{try{Class<?>
  • 标签:方法 实例
class="java">import java.lang.reflect.Field;

import sun.misc.Unsafe;
/**
 * @author fhj
 * @date 2018年5月7日 下午4:16:21
 * @version <b>1.0.0</b>
 */
public class CompareAndSwap {
	private static final Unsafe unsafe;

	private static final long fieldOffset;

	static {
		try {
			Class<?> clazz = User.class;
			unsafe = getUnsafe();
			fieldOffset = unsafe.objectFieldOffset(clazz.getDeclaredField("age"));//获取User中age字段在内存中的偏移量
		} catch (Exception ex) {
			throw new Error(ex);
		}
	}
	
	/**
	 * boolean sun.misc.Unsafe.compareAndSwapInt(Object arg0, long arg1, int arg2, int arg3)
	 * @param arg0-比较的对象
	 * @param arg1-需要修改的字段内存偏移量
	 * @param arg2-期待值(对比参考值)
	 * @param arg3-修改的值
	 * 描述:argo对象中arg1偏移量指向的字段值如果等于arg2,则将arg1偏移量指向的字段值改为arg3,返回true
	 * 否则不做任何操作,返回false
	 */
	public static void main(String[] args) {
		User user = new User(10);
		try {
			Boolean result;
			result = unsafe.compareAndSwapInt(user, fieldOffset, 10, 12);
			System.out.println(result);//true
			System.out.println(user.getAge());//12
			
			result = unsafe.compareAndSwapInt(user, fieldOffset, 10, 14);
			System.out.println(result);//false
			System.out.println(user.getAge());//12
			
			result = unsafe.compareAndSwapInt(user, fieldOffset, 12, 14);
			System.out.println(result);//true
			System.out.println(user.getAge());//14
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 通过代码反射获取Unsafe静态类
	 * 直接通过Unsafe.getUnsafe()获取会抛安全性异常
	 */
	private static Unsafe getUnsafe() {
		try {
			Field field = Unsafe.class.getDeclaredField("theUnsafe");
			field.setAccessible(true);
			Unsafe unsafe = (Unsafe) field.get(null);
			return unsafe;
		} catch (Exception ex) {
			throw new Error(ex);
		}
	}

	static class User {
		private int age;

		User(int age) {
			this.age = age;
		}

		public int getAge() {
			return age;
		}
	}
}

?

?

总结:因Unsafe类中的compareAndSwap方法是原子的,故可用来实现高性能的、无锁的数据结构

?

发表评论
用户名: 匿名