今天學習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()); } }