zoukankan      html  css  js  c++  java
  • 【并发】2、AtomicReferenceFieldUpdater初体验

    对于volatile对象的原子更新

    AtomicReferenceFieldUpdater这个对象进行原子更新的时候,外部操作对象只能是public,因为外部访问不到private对象,但是在内内部确可以自己封装一个compareAndSet

    package disruptor.test;
    
    import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
    
    import org.junit.Test;
    
    /**
     * 基于反射的实用工具,可以对指定类的指定 volatile 字段进行原子更新。该类用于原子数据结构,该结构中同一节点的几个引用字段都独立受原子更新控制。
     * @author xiaof
     * 
     *  compareAndSet(T obj, V expect, V update)
     *  obj - 有条件地设置其字段的对象
     *  expect - 预期值
     *  update - 新值 
     *    如果当前值 == 预期值,则以原子方式将此更新器管理的给定对象的字段设置为给定的更新值。对 compareAndSet 和 set 的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性    
     *
     */
    public class AtomicReferenceFieldUpdaterTest {
    
        @Test
        public void test1() {
            AtomicReferenceFieldUpdater update = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name2");
            Temp temp = new Temp();
            update.compareAndSet(temp, null, "66");
            update.compareAndSet(temp, "661", "6677");
            System.out.println(temp.name2);
            update.compareAndSet(temp, "66", "6677");
            System.out.println(temp.name2);
            
            //以下会报错
            /*
            AtomicReferenceFieldUpdater update2 = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name3");
            update2.compareAndSet(temp, null, "321");
            System.out.println(temp.name3);
            update2.compareAndSet(temp, null, "3211");
            System.out.println(temp.name3);
            update2.compareAndSet(temp, "321", "32112");
            System.out.println(temp.name3);
            */
            
            temp.compareAndSetName(null, "cutter");
            System.out.println("内部原子操作:" + temp.getName());
            temp.compareAndSetName3(null, "point");
            System.out.println("内部原子操作:" + temp.getName3());
            
        }
        
    }
    
    
    class Temp {
        private volatile String name;
        public volatile String name2;
        protected volatile String name3;
        
        public void compareAndSetName(String preValue, String name) {
            AtomicReferenceFieldUpdater update = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name");
            update.compareAndSet(this, preValue, name);
        }
        
        public void compareAndSetName3(String preValue, String name) {
            AtomicReferenceFieldUpdater update = AtomicReferenceFieldUpdater.newUpdater(Temp.class, String.class, "name3");
            update.compareAndSet(this, preValue, name);
        }
        
        public String getName() {
            return this.name;
        }
        
        public String getName3() {
            return this.name3;
        }
    }

    效果展示:

  • 相关阅读:
    设计模式之装饰者模式
    每天一点点
    生财有道
    地图的移动和缩放
    钱分割
    位运算
    ref和out
    使用startCoroutine制定倒计时
    静态类和单例类
    Awake和Start
  • 原文地址:https://www.cnblogs.com/cutter-point/p/8481323.html
Copyright © 2011-2022 走看看