java Unsafe类的compareAndSwap方法

compareAndSwap是个原子方法,原理是CAS,即将内存中的值与期望值进行比较,如果相等,就将内存中的值修改成新值并返回true。

package com.java.magic.part4.exception;

import java.lang.reflect.Field;

import sun.misc.Unsafe;

class Target{
	
	int intParam = 3;
	
	long longParam;
	
	String strParam;
}

public class UnsafeTest {
	
	private static Unsafe unsafe;
	
	static{
		try {
			Field field = Unsafe.class.getDeclaredField("theUnsafe");
			field.setAccessible(true);
			unsafe = (Unsafe)field.get(null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws Exception {
		
		Class clazz = Target.class;
		Field[] fields = clazz.getDeclaredFields();
		System.out.println("fieldNameeeee:fieldOffset");
		for(Field f : fields){
			//获取属性偏移量,可以通过这个偏移量给属性设值
			System.out.println(f.getName()+" : "+unsafe.objectFieldOffset(f));
		}
		System.out.println("--------------------------------");
		Target target = new Target();
		Field intParam = clazz.getDeclaredField("intParam");
		int a = (Integer) intParam.get(target);
		System.out.println("intParam原始值:"+a);
		long intParamOffset = unsafe.objectFieldOffset(intParam);
		System.out.println("intParam实例变量偏移量:"+intParamOffset);
		//intParam实例变量偏移量是offset 原始值是3,我们要改成10
		System.out.println(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10));
		System.out.println("intParam改变之后的值:"+target.intParam);
		
		System.out.println("--------------------------------");
		//这个时候已经改为10了,所以会返回false  
        System.out.println(unsafe.compareAndSwapInt(target, intParamOffset, 3, 10)); 
        
        System.out.println("--------------------------------");
        Field strParam = clazz.getDeclaredField("strParam");
        String str = (String) strParam.get(target);
        System.out.println("strParam原始值:"+str);
        long strParamOffset = unsafe.objectFieldOffset(strParam);
        System.out.println("strParam实例变量的偏移量是:"+strParamOffset);
        System.out.println(unsafe.compareAndSwapObject(target, strParamOffset, null, "5")); 
		System.out.println("strParam改变之后的值:"+target.strParam);
		
		
	}
	

}

 运行结果如下:


compareAndSwapInt是通过调用本地方法根据字段偏移去修改对象属性的. 

可以看到int是4个字节的偏移量,long是8个字节的偏移量
注意:Unsafe的对象不能直接new,这里通过反射去获取Unsafe里面的私有成员变量theUnsafe

版权声明:本文为iteye_7017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_7017/article/details/82673282

智能推荐

问题: Error inflating class RecyclerView

问题: Error inflating class RecyclerView-2020-4-25 详细: 看到里面 com.example.index_school_07:layout/item_detaillist: Error inflating class android.support.v7.widget.RecyclerView 这里报错 解决 android.support.v7.wi...

异常数据处理——箱型图分析原理及Python例程

箱型图分析原理及Python例程  一、箱型图分析原理 箱型图可以通过程序设置一个识别异常值的标准,即大于或小于箱型图设定的上下界的数值则识别为异常值,箱型图如下图所示: 首先我们定义下上四分位和下四分位: 上四分位我们设为 U,表示的是所有样本中只有1/4的数值大于U ,即从大到小排序时U处于25%处; 同理,下四分位我们设为 L,表示的是所有样本中只有1/4的数值...

2019.3.11

2019.3.11...

面试题49. 把字符串转换为整数

面试题49. 把字符串转换为整数 题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路: 对于输入的字符串,从后向前遍历,判断每一位...

猜你喜欢

Mysql入门——创建一个数据库

题目:创建一个教务管理数据库,名称为 JWGL 在 JWGL 数据库中创建学生表 Student、课程表 Course、学生选课表 SC,它们的表结构如下所示: 学生表Student 列名 数据类型 长度 允许空值 默认值 说明 Sno char 8 × 主键 Sname varchar 10 × Sex char 2 × 男 只能“男”...

从上到下打印二叉树

题目 从上到下打印出二叉树的每个节点,每层的节点按照从左到右的顺序打印。 例子:   打印顺序:8,6,10,5,7,9,11 二叉树节点定义: 思路: 本题实际上是层序遍历二叉树,根据题目特点,选用队列来存储相应节点,每次取出队列头部元素,如果该元素有子节点,将子节点放入队列中,如此循环。 代码 测试以及结果   总结 本题区别与二叉树的前中后序遍历,它们都是通过栈数据结构来...

Java GUI编程(13)---GridBagLayout网格袋布局

GridBagLayout(),网格袋布局,维持一个动态的矩形单元的网格,矩形单元格被称为显示区域。 组件可占用一个或多个的矩形单元格,组件不要求相同尺寸。 组件由GridBagLayou管理,关联一个约束GridBagConstraints类。 约束组件属性,比如:位置,大小,外部填充,内部填充等。 GridBagConstraints Class 约束属性与值 int gridx,gridy;...

h.264 aac librtmp推流应用

librtmp + h.264(MediaCodec) + aac(MediaCodec) + ams5 demo:https://github.com/wangzuxing/myrtmplive pc需安装ams5, 作为流服务器,android端通过pc端ip + ams5 rtmp端口跟流服务器建立连接(NetConnection) h.264: 摄像头预览数据 MediaCodec 编码(...

Conditional Generative Adversarial Nets

Introduction 对抗生成网络通过迭代的方式训练生成模型,可以避免棘手的概率近似。它不需要用到马尔可夫链这么复杂的东西,仅仅需要通过反向传播学习梯度。Goodfellow2014年在《Generative adversarial nets》指出它可以产生最先进的对数似然估计和现实样本。 这篇文章提出一种带条件的生成对抗网络(判别器和生成器都带条件)。在不带条件的对抗网络中,数据生成的模式不...