17、jdk5提供的原子类的操作以及实现原理

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();
    } 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值