AtomicIntegerFieldUpdater api詳解

 今天學習AtomicIntegerFieldUpdater類,該類是JUC原子包中的類,通過單元測試代碼把所有public api方法跑了一遍,大致瞭解了底層實現 

package test.java.util.concurrent.atomic;


import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.function.IntBinaryOperator;
import java.util.function.IntUnaryOperator;

import org.junit.Test;

/**
 * AtomicIntegerFieldUpdater的測試類
 *
 * @author zhangqingwei
 * @date 2020-06-17 21:30:27
 */
public class AtomicIntegerFieldUpdaterTest {
    private volatile int age;
    //abstract

    /**
     * 初始化採用靜態方法+內部類,私有化構造函數
     * 否則不更新,返回false
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testNewUpdater() {
        AtomicIntegerFieldUpdaterTest test=new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.get(test));
    }

    /**
     * 如果指定對象的目標屬性值爲expect的值,則更新成新值,返回true
     * 否則不更新,返回false
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testCompareAndSet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.compareAndSet(test, 0, 2));
        System.out.println(updater.get(test));
    }

    /**
     * 如果指定對象的目標屬性值爲expect的值,則更新成新值,返回true
     * 否則不更新,返回false
     * weakCompareAndSet和compareAndSet暫時未發現區別
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testWeakCompareAndSet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.weakCompareAndSet(test, 0, 2));
        System.out.println(updater.get(test));

    }

    /**
     * 設置指定對象的目標屬性值爲新的值,unsafe.putIntVolatile設置值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testSet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        updater.set(test, 22);
        System.out.println(updater.get(test));
    }

    /**
     * 設置指定對象的目標屬性值爲新的值,unsafe.putOrderedInt
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testLazySet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        updater.lazySet(test, 22);
        System.out.println(updater.get(test));
    }

    /**
     * 獲取指定對象的目標屬性值,需要檢查是否越界
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定對象的目標屬性值,並設置成新的值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGetAndSet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.getAndSet(test, 32));
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定對象的目標屬性值,並將值加一
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGetAndIncrement() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.getAndIncrement(test));
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定對象的目標屬性值,並將值減一
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGetAndDecrement() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.getAndDecrement(test));
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定對象的目標屬性值,並將值加一
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGetAndAdd() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.getAndAdd(test, 32));
        System.out.println(updater.get(test));
    }

    /**
     * 將值加一,並返回指定對象的目標屬性值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testIncrementAndGet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.incrementAndGet(test));
        System.out.println(updater.get(test));
    }

    /**
     * 將值減一,並返回指定對象的目標屬性值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testDecrementAndGet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.decrementAndGet(test));
        System.out.println(updater.get(test));
    }

    /**
     * 將值加一,並返回指定對象的目標屬性值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testAddAndGet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        System.out.println(updater.addAndGet(test, 32));
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定對象的目標屬性值,並更新成新值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGetAndUpdate() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        IntUnaryOperator operator = new IntUnaryOperator() {
            @Override
            public int applyAsInt(int operand) {
                return 33;
            }
        };
        System.out.println(updater.getAndUpdate(test, operator));
        System.out.println(updater.get(test));

    }

    /**
     * 更新成新值並返回指定對象的目標屬性值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testUpdateAndGet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        IntUnaryOperator operator = new IntUnaryOperator() {
            @Override
            public int applyAsInt(int operand) {
                return 33;
            }
        };
        System.out.println(updater.updateAndGet(test, operator));
        System.out.println(updater.get(test));
    }

    /**
     * 返回指定對象的目標屬性值,並更新成新值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testGetAndAccumulate() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        IntBinaryOperator operator = new IntBinaryOperator() {
            @Override
            public int applyAsInt(int left, int right) {
                return 332;
            }
        };
        System.out.println(updater.getAndAccumulate(test, 2, operator));
        System.out.println(updater.get(test));
    }

    /**
     * 更新成新值並返回指定對象的目標屬性值
     *
     * @throws
     * @date 2020/6/16 23:46
     */
    @Test
    public void testAccumulateAndGet() {
        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,
                "age");
        IntBinaryOperator operator = new IntBinaryOperator() {
            @Override
            public int applyAsInt(int left, int right) {
                return 332;
            }
        };
        System.out.println(updater.accumulateAndGet(test, 2, operator));
        System.out.println(updater.get(test));
    }

}

 

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