当前位置: 移动技术网 > IT编程>开发语言>Java > Java concurrency之AtomicReference原子类_动力节点Java学院整理

Java concurrency之AtomicReference原子类_动力节点Java学院整理

2019年07月22日  | 移动技术网IT编程  | 我要评论
atomicreference介绍和函数列表 atomicreference是作用是对"对象"进行原子操作。 atomicreference函数列表 // 使

atomicreference介绍和函数列表

atomicreference是作用是对"对象"进行原子操作。

atomicreference函数列表

// 使用 null 初始值创建新的 atomicreference。
atomicreference()
// 使用给定的初始值创建新的 atomicreference。
atomicreference(v initialvalue)
// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean compareandset(v expect, v update)
// 获取当前值。
v get()
// 以原子方式设置为给定值,并返回旧值。
v getandset(v newvalue)
// 最终设置为给定值。
void lazyset(v newvalue)
// 设置为给定值。
void set(v newvalue)
// 返回当前值的字符串表示形式。
string tostring()
// 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
boolean weakcompareandset(v expect, v update)

atomicreference源码分析(基于jdk1.7.0_40)

在jdk1.7.0_40中atomicreference.java的源码如下:

public class atomicreference<v> implements java.io.serializable {
  private static final long serialversionuid = -1848883965231344442l;
  // 获取unsafe对象,unsafe的作用是提供cas操作
  private static final unsafe unsafe = unsafe.getunsafe();
  private static final long valueoffset;
  static {
   try {
    valueoffset = unsafe.objectfieldoffset
      (atomicreference.class.getdeclaredfield("value"));
   } catch (exception ex) { throw new error(ex); }
  }
  // volatile类型
  private volatile v value;
  public atomicreference(v initialvalue) {
    value = initialvalue;
  }
  public atomicreference() {
  }
  public final v get() {
    return value;
  }
  public final void set(v newvalue) {
    value = newvalue;
  }
  public final void lazyset(v newvalue) {
    unsafe.putorderedobject(this, valueoffset, newvalue);
  }
  public final boolean compareandset(v expect, v update) {
    return unsafe.compareandswapobject(this, valueoffset, expect, update);
  }
  public final boolean weakcompareandset(v expect, v update) {
    return unsafe.compareandswapobject(this, valueoffset, expect, update);
  }
  public final v getandset(v newvalue) {
    while (true) {
      v x = get();
      if (compareandset(x, newvalue))
        return x;
    }
  }
  public string tostring() {
    return string.valueof(get());
  }
}

说明:

atomicreference的源码比较简单。它是通过"volatile"和"unsafe提供的cas函数实现"原子操作。

(01) value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。

(02) 通过cas设置value。这保证了:当某线程池通过cas函数(如compareandset函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。

atomicreference示例

// atomicreferencetest.java的源码

import java.util.concurrent.atomic.atomicreference;
public class atomicreferencetest {
  public static void main(string[] args){
    // 创建两个person对象,它们的id分别是101和102。
    person p1 = new person(101);
    person p2 = new person(102);
    // 新建atomicreference对象,初始化它的值为p1对象
    atomicreference ar = new atomicreference(p1);
    // 通过cas设置ar。如果ar的值为p1的话,则将其设置为p2。
    ar.compareandset(p1, p2);
    person p3 = (person)ar.get();
    system.out.println("p3 is "+p3);
    system.out.println("p3.equals(p1)="+p3.equals(p1));
  }
}
class person {
  volatile long id;
  public person(long id) {
    this.id = id;
  }
  public string tostring() {
    return "id:"+id;
  }
}

运行结果:

p3 is id:102
p3.equals(p1)=false

结果说明:

新建atomicreference对象ar时,将它初始化为p1。

紧接着,通过cas函数对它进行设置。如果ar的值为p1的话,则将其设置为p2。

最后,获取ar对应的对象,并打印结果。p3.equals(p1)的结果为false,这是因为person并没有覆盖equals()方法,而是采用继承自object.java的equals()方法;而object.java中的equals()实际上是调用"=="去比较两个对象,即比较两个对象的地址是否相等。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网