美文网首页每天写500字程序员每天写1000字
Java原子属性更新器AtomicReferenceFieldU

Java原子属性更新器AtomicReferenceFieldU

作者: Maker在杭州 | 来源:发表于2018-05-29 22:42 被阅读3次

AtomicReferenceFieldUpdater是基于反射的工具类,用来将指定类型的指定的volatile引用字段进行原子更新,对应的原子引用字段不能是private的。通常一个类volatile成员属性获取值、设定为某个值两个操作时非原子的,若想将其变为原子的,则可通过AtomicReferenceFieldUpdater来实现。如下面例子:

public class AtomicReferTest { 
    public static void main(String[] args) throws Exception   {  
        AtomicReferenceFieldUpdater updater=AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class,"name");  
        Dog dog1=new Dog();  
        System.out.println(updater.compareAndSet(dog1,"dog1","compareAndSet"));        
        System.out.println(dog1.name);  
        System.out.println(updater.getAndSet(dog1, "getAndSet"));
        System.out.println(dog1.name);
    }  
} 
class Dog  
{ volatile  String name="dog1";  

}

输出结果:

true
compareAndSet
compareAndSet
getAndSet

通过调用AtomicReferenceFieldUpdater.newUpdater(Dog.class,String.class,"name")静态方法生成Dog类的String类型的name字段的原子修改器updater,然后调用它的compareAndSet方法判断dog1对象的name值是否为dog1,若是则返回true并修改其值。也可调用getAndSet方法直接修改dog1属性的name字段值,并返回该字段原来的值。

Java类库中BufferedInputStream就调用了这个类:

public class BufferedInputStream extends FilterInputStream { protected volatile byte buf[]; /* *  原子的更新内部数组,比如扩容、关闭时, */
    private static final AtomicReferenceFieldUpdater<BufferedInputStream, byte[]> bufUpdater = AtomicReferenceFieldUpdater.newUpdater
        (BufferedInputStream.class,  byte[].class, "buf"); public void close() throws IOException { byte[] buffer; while ( (buffer = buf) != null) { //放在一个循环中,如果CAS更新失败,那么就读取最新的buf引用,继续CAS更新
            if (bufUpdater.compareAndSet(this, buffer, null)) {
                InputStream input = in;
                in = null;
                   if (input != null)
                      input.close(); 
                    return;
            }
        }
    }
}

AtomicReferenceFieldUpdater是Doug Lea在Java 5中写的atomic classes 中Filed Updater的一部分,本质上是volatile字段的包装器。相似的还有AtomicIntegerFieldUpdater,具体使用方法可参考:https://github.com/aCoder2013/blog/issues/10

相关文章

  • Java原子属性更新器AtomicReferenceFieldU

    AtomicReferenceFieldUpdater是基于反射的工具类,用来将指定类型的指定的volatile引...

  • 并发编程艺术-7

    本文主要介绍了java 中的 原子操作类,分为原子更新基本类型,原子更新数组,原子更新引用,原子更新属性,基本上都...

  • Java - 原子操作类

    Java中的12个原子操作类 原子更新基本类型类 AtomicBoolean:原子更新布尔类型 AtomicInt...

  • java8_原子更新

    标签:java 原子更新 回顾使用 Aotimic使用(自增,自减都为原子操作) LongAdder,LongAc...

  • 原子字段更新器

    AtomicIntegerFieldUpdater AtomicLongFieldUpdater AtomicRe...

  • Objective-C 属性特性

    @property 特性分为三类:原子性、存取器控制、内存管理。 原子性 atomic 指定属性的原...

  • @property里的各种attribute特质理解

    1、原子性atomicity,在默认情况下,编译器合成的方法会通过锁定机制确保属性的原子性,如果属性具备nonat...

  • java线程之atomic包简介

    java.util.concurrent.atomic 包中提供了一些原子操作类, 可分为4中类型: 原子更新基本...

  • 原子属性

    非原子属性nonatomic 和原子属性atomic 原子属性atomic:就是为了保证这个属性的安全性(线程安全...

  • Java并发机制底层实现原理-原子操作的实现原理

    章节目录 原子操作含义 相关术语 保证多处理器操作原子性的两种方式 Java语言层面上实现原子操作 原子操作的含义...

网友评论

    本文标题:Java原子属性更新器AtomicReferenceFieldU

    本文链接:https://www.haomeiwen.com/subject/kjjzjftx.html