AtomicReferenceFieldUpdater api详解

今天学习AtomicReferenceFieldUpdater类,该类是JUC原子包中的类,通过单元测试代码把所有public api方法跑了一遍,大致了解了底层实现

package test.java.util.concurrent.atomic;


import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import java.util.function.BinaryOperator;
import java.util.function.LongBinaryOperator;
import java.util.function.UnaryOperator;

import org.junit.Test;

/**
 * AtomicReferenceFieldUpdater的测试类
 *
 * @author zqw
 * @date 2020-06-20 22:34:19
 */
public class AtomicReferenceFieldUpdaterTest {
    //abstract
    private volatile Integer age;

    /**
     * 初始化采用静态方法+内部类,私有化构造函数
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testNewUpdater() {
        AtomicReferenceFieldUpdaterTest test=new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        System.out.println(updater.get(test));
    }

    /**
     * 如果指定对象的目标属性值为expect的值,则更新成新值,返回true
     * 否则不更新,返回false
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testCompareAndSet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        System.out.println(updater.compareAndSet(test, null, 2));
        System.out.println(updater.get(test));
    }

    /**
     * 如果指定对象的目标属性值为expect的值,则更新成新值,返回true
     * 否则不更新,返回false
     * weakCompareAndSet和compareAndSet暂时未发现区别
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testWeakCompareAndSet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        System.out.println(updater.weakCompareAndSet(test, null, 2));
        System.out.println(updater.get(test));

    }

    /**
     * 设置指定对象的目标属性值为新的值,unsafe.putIntVolatile设置值
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testSet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        updater.set(test, 22);
        System.out.println(updater.get(test));
    }

    /**
     * 设置指定对象的目标属性值为新的值,unsafe.putOrderedInt
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testLazySet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        updater.lazySet(test, 22);
        System.out.println(updater.get(test));
    }

    /**
     * 获取指定对象的目标属性值,需要检查是否越界
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testGet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定对象的目标属性值,并设置成新的值
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testGetAndSet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        System.out.println(updater.getAndSet(test, 32));
        System.out.println(updater.get(test));
    }



    /**
     * 返回指定对象的目标属性值,并更新成新值
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testGetAndUpdate() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
         UnaryOperator operator = new UnaryOperator() {
             @Override
             public Object apply(Object o) {
                 return new Integer(333);
             }
         };
        System.out.println(updater.getAndUpdate(test, operator));
        System.out.println(updater.get(test));

    }

    /**
     * 更新成新值并返回指定对象的目标属性值
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testUpdateAndGet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        UnaryOperator operator = new UnaryOperator() {
            @Override
            public Object apply(Object o) {
                return new Integer(333);
            }
        };
        System.out.println(updater.updateAndGet(test, operator));
        System.out.println(updater.get(test));
    }
    /**
     * 返回指定对象的目标属性值,并更新成新值
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testGetAndAccumulate() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        BinaryOperator operator = new BinaryOperator() {
            @Override
            public Object apply(Object o, Object o2) {
                return o2;
            }
        };
        System.out.println(updater.getAndAccumulate(test, 2, operator));
        System.out.println(updater.get(test));
    }

    /**
     * 更新成新值并返回指定对象的目标属性值
     *
     * @throws
     * @date 2020/6/20 23:46
     */
    @Test
    public void testAccumulateAndGet() {
        AtomicReferenceFieldUpdaterTest test = new AtomicReferenceFieldUpdaterTest();
        AtomicReferenceFieldUpdater updater = AtomicReferenceFieldUpdater.newUpdater(AtomicReferenceFieldUpdaterTest.class,
                Integer.class,"age");
        BinaryOperator operator = new BinaryOperator() {
            @Override
            public Object apply(Object o, Object o2) {
                return o2;
            }
        };
        System.out.println(updater.accumulateAndGet(test, 2, operator));
        System.out.println(updater.get(test));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章