以原子性更新Cat类的name属性为例:
name属性需要保持 可见性,且 不是私有变量。
class Cat { volatile String name = "mycat"; }
1. 实例化Updater
调用 AtomicReferenceFieldUpdater类的静态 newUpdater方法实例化,传入需要原子性更新属性的Cat类、被更新属性类型为String,名称为name:
AtomicReferenceFieldUpdaterupdater = AtomicReferenceFieldUpdater.newUpdater(Cat.class, String.class, "name");
2. 实例化目标类
创建一个需要原子性更新name属性的Cat实例:
Cat cat1 = new Cat();
3. 原子性更新
调用 compareAndSet方法原子性更新name属性:传入上一步创建的Cat实例cat1、期望的原name值和新name值:
当cat1的原name值是期望的"mycat"时,会被更新为"myPet"
updater.compareAndSet(cat1, "mycat", "myPet"); System.out.println(cat1.name); // myPet
原name值不是"mycat"时,不予更新:
cat1.name = "mycat1"; updater.compareAndSet(cat1, "mycat", "myPet"); System.out.println(cat1.name); // mycat1