UnSafe类中的一些重要方法
UnSafe类中的一些重要方法
JDK中的rt.jar保重Unsafe类中提供了硬件级别的原子性操作,Unsafe类中的方法都是navtice方法,他们使用JNI的方式访问C++实现库,下面我们来了解一下Unsafe提供的几个主要方法以及编程时如何使用Unsafe类做一些事情。
long objectFieldOffset(Field field)方法;返回指定变量所属类中的内存偏移量,该偏移量仅在使用该Unsafe函数中访问指定字节时使用。如下代码使用Unsafe获取变量value在AtomicLong对象中的内存偏移。
static{
try{
valueOffset=unsafe.objectFieldOffset(AtomicLong.class.getDeclaredField("value"));
}catch(Exception e){
throw new Error(r);
}
}
int arrayBaseOffset(Class arrayClass)方法:获取数组中第一个元素的地址
int arrayIndexScale(Class arrayClass)方法:获取数组中一个元素的大小
boolean compareAndSwapLong(Object obj,long offset,long expect,long update)方法比较对象obj中val值是否等于expect值如果相等就将其设置为update;
public native long getLongvolatile(Object obj,long offset)方法:获取一个long值的属性
void putLongvolatile(Object obj,long offset,long value)方法:设置obj对象中offset偏移地址对用的long类field值为value。
void putOrderedLong(Object obj,long offset,long value)方法:
void park(boolean isAbsoulte,long time)方法:阻塞当前线程(这个方法在AQS中的使对象等待时会使用到)。isAbsoulte的为是否是绝对时间,如果isAbsoulte为false,其中time为大于0,那么
当前线程会在等待time后唤醒。如果isAbsolute为false,其中time为0,那么线程为无限等待。如果isAbosult为true,那么time就是指的是绝对时间也就是换算为ms后的绝对时间。另外,当其他线程调用了当前阻塞线程的interrupt方法而中断了当前线程时,当前线程也会返回,而其他线程调用unPark方法并且把当前线程作为参数时也会返回
void unpark(Object thread)方法:唤醒调用park线程的线程
long getAndSetLong(Object obj,long offset,long update)方法:获取对象obj中偏移量为offset的变量volatile予以的当前值,并设置变量volatile语义的值为update;
public final long getAndSetLong(Object obj,long offset , long update){
long l;
do{
l = getLongVolatile(obj,offset);
}while(!compareAndSwapLong(obj,offset,l,update));
return l;
}
long getAndAddLong(Object obj,long offset,long add)方法:设置原始值为val+add;
public final long getAndSetLong(Object obj,long offset , long add){
long l;
do{
l = getLongVolatile(obj,offset);
}while(!compareAndSwapLong(obj,offset,l,l+add));
return l;
}
UnSafe类中的一些重要方法的更多相关文章
- 创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法)。
创建如下三个类:(People类中的三个方法分别输出一些信息,ChinaPeople 和AmericanPeople类重写父类的三个方法). ackage com.chuoji.text01; pub ...
- 关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法
Integer类中的. 关于parseInt()方法的API文档. 返回的是int类型的 关于valueOf()方法的API文档 返回的是Integer类型的. 关于intValue()方法的API ...
- org.apache.commons.lang3.StringUtils类中isBlank和isEmpty方法的区别
相信很多java程序员在写代码的时候遇到判断某字符串是否为空的时候会用到StringUtils类中isBlank和isEmpty方法,这两个方法到底有什么区别呢?我们用一段代码来阐述这个区别吧: @T ...
- 在eclispe的类中快速打出main方法
在java类中快速打出main方法有两种途径: 1. 在新建类时,在New Java Class窗口中,将public static void main ( String[ ] args ) 前面打上 ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
- php面向对象类中常用的魔术方法
php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct( ...
- 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘
孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...
- Python 简明教程 --- 20,Python 类中的属性与方法
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...
- Class类中getMethods() 与getDeclaredMethods() 方法的区别
一:jdk API中关于两个方法的解释 1:getMethods(),该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的) 2:getDeclaredMethods(),该方 ...
随机推荐
- 迷你MVVM框架 avalonjs 1.3.4发布
发现一个以前从来没发现的大BUG,紧急发布此版本. fix getEachProxy BUG,此BUG会导致监控数组在删除某元素然后再添加元素时出现问题. avalon ms-on-*绑定添加一个钩子 ...
- 在mybatis中模糊查询有三种写法
<select id="selectStudentsByName" resultType="Student"> <!--第一种--> ...
- jsp编译器指令errorPage的用法
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- eclipse中使用maven的 maven install
windows -> preferences -> Java -> Installed JREs 在default VM arguments 中添加 -Dmaven.multiMod ...
- Linux-CentOS 更新Firefox版本
1.用你本地的旧版 firefox,访问http://www.firefox.com.cn,下载Linux版本的Firefox. 2.进入存放下载文件(Firefox-latest-x86_64.ta ...
- 新手C#属性set,get的学习(部分转)2018.08.06
public class person { public string name; } public class person { public string Name { set; get; } } ...
- binary tree
一.中序线索化 二叉树节点定义: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; int isle ...
- jquery去掉click事件
1:使用removeAttr( )和attr( ) $("a").attr("click",test()); $("a").removeAt ...
- uva10288 Coupons 【概率 分数】
题目: 题意: 一共n种不同的礼券,每次得到每种礼券的概率相同.求期望多少次可以得到所有n种礼券.结果以带分数形式输出.1<= n <=33. 思路: 假设当前已经得到k种,获得新的一种的 ...
- MD5加密算法原理及其应用
MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...