1.原子更新基本类型
类
AtomicInteger
AtomicBoolean
AtomicLong
方法
(1).int addAndGet(int delta): 以原子的方式将输入的数值与实例中的值相加,并返回结果。
(2).boolean compareAndSet(int expect, int update): 如果输入的值等于预期值,则以原子方式将该值设置为输入的值。
(3).int getAndIncrement(): 以原子的方式将当前值加1,注意,这里返回的是自增前的值。
(4).void lazySet(int newValue): 最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
(5).int getAndSet(int newValue): 以原子的方式设置为newValue,并返回旧值。
示例
private AtomicInteger value = new AtomicInteger(0);
value.getAndIncrement();//自增
value.getAndAdd(10);//加10
2.原子更新数组
AtomicIntegerArray: 原子更新整型数组里的元素。
AtomicLongArray: 原子更新长整型数组里的元素。
AtomicReferenceArray: 原子更新引用类型数组里的元素。
get(int index):获取索引为index的元素值。
compareAndSet(int i,E expect,E update): 如果当前值等于预期值,则以原子方式将数组位置i的元素设置为update值。
private int [] s ={1,2,3,4}
AtomicIntegerArray a = new AtomicIntegerArray(s)
3.应用场景与原理
应用场景:原子变量不使用锁或其他同步机制来保护对其值的并发访问。所有操作都是基于CAS原子操作的。他保证了多线程在同一时间操作一个原子变量而不会产生数据不一致的错误,并且他的性能优于使用同步机制保护的普通变量,1.譬如说在多线程环境中统计次数就可以使用原子变量。
在多线程环境中,可以很多情况可使用该关键字替换synchronized。
在高并发的场景下,也可以用来限制接口的流量,超过并发的数量的阈值进行熔断等操作。
CAS:
class Counter {
private AtomicInteger max = new AtomicInteger();
public void set(int value) {
for (;;) {
int current = max.get();
if (value > current) {
if (max.compareAndSet(current, value)) { //CAS
break;
} else {
continue; }
} else { break; } } }
public int getMax() {
return max.get();
}
}