java Unsafe类的compareAndSwap方法
2016-06-29 23:10
232 查看
compareAndSwap是个原子方法,原理是cas.就是说如果他是xx,那么就改为xxx.
这个是高效,而且是原子的,不用加锁.
也不用但是其他值改了而产生误操作,应为会先判断当前值,符合期望才去改变.
直接上代码吧
Java代码
package com.huangyunbin;
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class UnsafeTest {
private static Unsafe unsafe;
static {
try {
//通过反射获取rt.jar下的Unsafe类
Field field = Unsafe.
4000
class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe) field.get(null);
} catch (Exception e) {
System.out.println("Get Unsafe instance occur error"+ e);
}
}
public static void main(String[] args) throws Exception
{
Class clazz = Target.class;
Field[] fields = clazz.getDeclaredFields();
System.out.println("fieldName:fieldOffset");
for (Field f : fields) {
// 获取属性偏移量,可以通过这个偏移量给属性设置
System.out.println(f.getName() + ":" + unsafe.objectFieldOffset(f));
}
Target target = new Target();
Field intFiled = clazz.getDeclaredField("intParam") ;
int a=(Integer)intFiled.get(target ) ;
System.out.println("原始值是:"+a);
//intParam的字段偏移是12 原始值是3 我们要改为10
System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
int b=(Integer)intFiled.get(target) ;
System.out.println("改变之后的值是:"+b);
//这个时候已经改为10了,所以会返回false
System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
System.out.println(unsafe.compareAndSwapObject(target, 24, null, "5"));
}
}
class Target {
int intParam=3;
long longParam;
String strParam;
String strParam2;
}
结果是:
fieldName:fieldOffset
intParam:12
longParam:16
strParam:24
strParam2:28
原始值是:3
true
改变之后的值是:10
false
true
compareAndSwapInt是通过反射根据字段偏移去修改对象的.
可以看到int是4个字节的偏移量,long是4个字节的偏移量,string是4个字节的偏移量
注意 Unsafe的对象不能直接new,要通过反射去获取.
这个是高效,而且是原子的,不用加锁.
也不用但是其他值改了而产生误操作,应为会先判断当前值,符合期望才去改变.
直接上代码吧
Java代码
package com.huangyunbin;
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class UnsafeTest {
private static Unsafe unsafe;
static {
try {
//通过反射获取rt.jar下的Unsafe类
Field field = Unsafe.
4000
class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe) field.get(null);
} catch (Exception e) {
System.out.println("Get Unsafe instance occur error"+ e);
}
}
public static void main(String[] args) throws Exception
{
Class clazz = Target.class;
Field[] fields = clazz.getDeclaredFields();
System.out.println("fieldName:fieldOffset");
for (Field f : fields) {
// 获取属性偏移量,可以通过这个偏移量给属性设置
System.out.println(f.getName() + ":" + unsafe.objectFieldOffset(f));
}
Target target = new Target();
Field intFiled = clazz.getDeclaredField("intParam") ;
int a=(Integer)intFiled.get(target ) ;
System.out.println("原始值是:"+a);
//intParam的字段偏移是12 原始值是3 我们要改为10
System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
int b=(Integer)intFiled.get(target) ;
System.out.println("改变之后的值是:"+b);
//这个时候已经改为10了,所以会返回false
System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
System.out.println(unsafe.compareAndSwapObject(target, 24, null, "5"));
}
}
class Target {
int intParam=3;
long longParam;
String strParam;
String strParam2;
}
结果是:
fieldName:fieldOffset
intParam:12
longParam:16
strParam:24
strParam2:28
原始值是:3
true
改变之后的值是:10
false
true
compareAndSwapInt是通过反射根据字段偏移去修改对象的.
可以看到int是4个字节的偏移量,long是4个字节的偏移量,string是4个字节的偏移量
注意 Unsafe的对象不能直接new,要通过反射去获取.
相关文章推荐
- 论文笔记之:Heterogeneous Image Features Integration via Multi-Modal Semi-Supervised Learning Model
- 记录JavaScript学习第一天
- LeetCode - 86. Partition List
- 将Buffer对象结合创建为一个新的Buffer对象
- Buffer.byteLength(字符串,编码方式)计算指定字符串的字节数
- HTML <form> 标签的 action 属性
- Permission denied: user=Administrator, access=WRITE, inode="/aa/mytest10.txt":anne:supergroup:drwxr
- js中访问对象的方法
- JavaScript面向对象详解
- JavaScript知识总结<一>
- Chrome Json插件
- js(十)——dom模型
- extjs3里面的获取不到store内数值,采用store.on('load', function() {});不执行
- jquery中的attributes和properties
- Nodejs使用post发送请求与批量发送请求
- 【CSS3】选择器(表单元素选择器 & 其他)--慕课网【学习总结】
- 6.29(HTML)
- MYSQL 专家 ----zhaiwx_yinfeng
- 学习笔记 css 声明 注释
- JS导出 excel(适用于ie内核浏览器)