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;
}

原文地址:https://www.cnblogs.com/Heliner/p/10786306.html

时间: 2024-10-19 20:06:10

UnSafe类中的一些重要方法的相关文章

增加、删除类文件或者在一个类中增加、删除方法时,是不能够热部署到服务上的。这时候需要停止服务器重新部署后再启动,就不会出现上面的提示了。

Hot Code Replace Failed 2010-11-05 10:11listquiry | 浏览 14226 次 Some code changes cannot be hot swapped into a running virtual machine, such as changing method names or introducing errors into running code.The current target virtual machine {jboss4Ser

php面向对象类中常用的魔术方法

php面向对象类中常用的魔术方法 1.__construct():构造方法,当类被实例化new $class时被自动调用的方法,在类的继承中可以继承与覆盖该方法,例: //__construct() class construct{ public function __construct(){ $this->var = "this is var"; } } class con2 extends construct{ public function __construct(){ $

【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法

现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在现在的项目中使用的主要是afinal框架,而且这个框架确实比较不错,省去了不少工作量,在编写Activity的过程中,基本都是直接继承自FinalActivity类,这样可以使用这个类给我们封装好的不少的方法,但是随着项目慢慢推进,这种直接继承框架类的一些缺点也开始慢慢的显现出来.最主要的就

org.apache.commons.lang3.StringUtils类中isBlank和isEmpty方法的区别

相信很多java程序员在写代码的时候遇到判断某字符串是否为空的时候会用到StringUtils类中isBlank和isEmpty方法,这两个方法到底有什么区别呢?我们用一段代码来阐述这个区别吧: 1 @Test 2 public void blankEmpty() { 3 String str = " "; 4 System.out.println("Is empty ? " + StringUtils.isEmpty(str)); 5 System.out.pri

在类中使用Response.Redirect()方法

Insus.NET稍作演示,能正常运作.可以往下慢慢看来.首先是user类: 然后,我们在一个网页,如Default.aspx.cs实例化上面的User类. 可以看看实时操作演示: 在类中使用Response.Redirect()方法

Python 之面向对象:类和对象调用类中的变量和方法

面向对象的核心是对象,用对象来操控类里面的方法和变量,加上类还具有继承.封装.多态三大特性,提高了代码的复用性和规范性. 一.对象 调用类中的变量和方法 二 .类  调用类中的变量和方法 原文地址:https://www.cnblogs.com/tianpin/p/11283032.html

java类中获取ServletContext的方法

起因是我想要获取一个相对路径,需要用到servletContext的getRealPath()方法,于是上网搜索,找到两种方法来获取ServletContext. 第一种方法是这样的: ServletActionContext.getServletContext(): 后来发现这种方法只有在从浏览器打开的时候才能获取到ServletContext,否则在普通的java类中会报空指针错误(找不到ServletContext),猜测可能是因为ServletActionContext是struts2封

java的Object类中hashCode()和equals()方法-----转载

JAVA代码:    public static void main(String[] args)    {        Object obj1 = new Object();        Object obj2= new Object();        Object obj3 = obj2;        System.out.println("obj1==obj2 ?"+obj1.equals(obj2));        System.out.println("o

Java 类中的变量和方法

1.类中定义的域变量可以被类中的所有方法访问. 2.方法中形式参数和定义的局部变量的作用域仅限于该方法中,局部变量在使用前必须进行赋值初始化. 3.如果局部变量和类中的域变量重名,则在方法中对同名变量改变的是局部变量. 4.在方法中如果要使用类的域变量,需要引入 this 关键字.