java多线程--AtomicLongFieldUpdater
Posted 通凡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程--AtomicLongFieldUpdater相关的知识,希望对你有一定的参考价值。
AtomicLongFieldUpdater介绍
AtomicLongFieldUpdater可以对指定"类的 ‘volatile long‘类型的成员"进行原子更新。它是基于反射原理实现的。
AtomicLongFieldUpdater示例
// LongTest.java的源码 import java.util.concurrent.atomic.AtomicLongFieldUpdater; public class LongFieldTest { public static void main(String[] args) { // 获取Person的class对象 Class cls = Person.class; // 新建AtomicLongFieldUpdater对象,传递参数是“class对象”和“long类型在类中对应的名称” AtomicLongFieldUpdater mAtoLong = AtomicLongFieldUpdater.newUpdater(cls, "id"); Person person = new Person(12345678L); // 比较person的"id"属性,如果id的值为12345678L,则设置为1000。 mAtoLong.compareAndSet(person, 12345678L, 1000); System.out.println("id="+person.getId()); } } class Person { volatile long id; public Person(long id) { this.id = id; } public void setId(long id) { this.id = id; } public long getId() { return id; } }
运行结果:
id=1000
AtomicLongFieldUpdater源码
AtomicLongFieldUpdater完整源码
源码较为简单,详见官网
下面分析LongFieldTest.java的流程。
1. newUpdater()
newUpdater()的源码如下:
public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName) { Class<?> caller = Reflection.getCallerClass(); if (AtomicLong.VM_SUPPORTS_LONG_CAS) return new CASUpdater<U>(tclass, fieldName, caller); else return new LockedUpdater<U>(tclass, fieldName, caller); }<span style="font-family:'Courier New' !important;color:#000000;font-size: 12px !important; line-height: 1.5 !important;"></span>
说明:newUpdater()的作用是获取一个AtomicIntegerFieldUpdater类型的对象。
它实际上返回的是CASUpdater对象,或者LockedUpdater对象;具体返回哪一个类取决于JVM是否支持long类型的CAS函数。CASUpdater和LockedUpdater都是AtomicIntegerFieldUpdater的子类,它们的实现类似。下面以CASUpdater来进行说明。
CASUpdater类的源码如下:
public boolean compareAndSet(T obj, long expect, long update) { if (obj == null || obj.getClass() != tclass || cclass != null) fullCheck(obj); return unsafe.compareAndSwapLong(obj, offset, expect, update); }<span style="font-family:'Courier New' !important;color:#000000;font-size: 12px !important; line-height: 1.5 !important;"></span>
说明:它实际上是通过CAS函数操作。如果类的long对象的值是expect,则设置它的值为update。
以上是关于java多线程--AtomicLongFieldUpdater的主要内容,如果未能解决你的问题,请参考以下文章