AtomicReference api詳解

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

package test.java.util.concurrent.atomic;


import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BinaryOperator;
import java.util.function.UnaryOperator;

import org.junit.Test;

/**
 * AtomicReference的測試類
 *
 * @author zqw
 * @date 2020-06-20 21:51:08
 */
public class AtomicReferenceTest {
        /**
         * 無參構造函數
         *
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testConstruct0()throws Exception{
        AtomicReference testObj=new AtomicReference();
                System.out.println(testObj.get());
        }
        /**
         * 設置引用對象構造函數
         *
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testConstruct1()throws Exception{
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                System.out.println(testObj.get());
        }
        /**
         * 獲取引用對象
         *
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testGet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                System.out.println(testObj.get());
        }
        /**
         * 設置引用對象
         *
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testSet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                testObj.set(test1);
                System.out.println(test);
                System.out.println(test1);
                System.out.println(testObj.get());
        }
        /**
         * 設置引用對象
         *set()和lazySet相同
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testLazySet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                testObj.lazySet(test1);
                System.out.println(test);
                System.out.println(test1);
                System.out.println(testObj.get());
        }
        /**
         * 如果引用對象爲expect的值,則設置成新值,否則不設置
         *
         *
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testCompareAndSet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                testObj.compareAndSet(test,test1);
                System.out.println(testObj.get());
        }
        /**
         * 如果引用對象爲expect的值,則設置成新值,否則不設置
         *
         *和CompareAndSet用法一樣
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testWeakCompareAndSet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                testObj.weakCompareAndSet(test,test1);
                System.out.println(testObj.get());
        }
        /**
         * 獲取舊的引用對象,並設置成新值
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testGetAndSet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                testObj.getAndSet(test1);
                System.out.println(testObj.get());
        }
        /**
         * 獲取舊的引用對象,並設置成新值
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testGetAndUpdate(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                UnaryOperator operator=new UnaryOperator() {
                        @Override
                        public Object apply(Object o) {
                                return test1;
                        }
                };
                System.out.println(testObj.getAndUpdate(operator));
                System.out.println(testObj.get());
        }
        /**
         * 設置成新值並獲取引用對象
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testUpdateAndGet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                UnaryOperator operator=new UnaryOperator() {
                        @Override
                        public Object apply(Object o) {
                                return test1;
                        }
                };
                System.out.println(testObj.updateAndGet(operator));
                System.out.println(testObj.get());
        }
        /**
         * 獲取舊的引用對象,並設置成新值
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testGetAndAccumulate(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                BinaryOperator operator=new BinaryOperator() {
                        @Override
                        public Object apply(Object o, Object o2) {
                                return o2;
                        }
                };
                System.out.println(testObj.getAndAccumulate(test1, operator));
                System.out.println(testObj.get());
        }
        /**
         * 設置成新值並獲取引用對象
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testAccumulateAndGet(){
                AtomicReferenceTest test=new AtomicReferenceTest();
                AtomicReferenceTest test1=new AtomicReferenceTest();
                AtomicReference testObj=new AtomicReference(test);
                BinaryOperator operator=new BinaryOperator() {
                        @Override
                        public Object apply(Object o, Object o2) {
                                return o2;
                        }
                };
                testObj.getAndAccumulate(test,operator);
                System.out.println(testObj.get());
        }
        /**
         * 獲取引用對象的toString
         * @author zqw
         * @date 2020-06-20 21:51:08
         */
        @Test
        public void testToString(){
                AtomicReference testObj=new AtomicReference();
                System.out.println(testObj.toString());
        }







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