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