今天学习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));
}
}