浅析atomic原子性

什么是atomic

java.util.concurrent.atomic包中的很多类使用很高效的机器级指令(而不是锁)来保证操作的原子性。

有哪些常用的类

查看api可以知道atomic包下含有以下

比较常用的有AtomicBoolean、AtomicInteger、AtomicIntegerArray、AtomicLong等。

看看怎么使用

以AtomicLong举例,得到一个AtomicLong对象之后,可以使用incrementAndGet和decrementAndGet通过原子方式将一个整数自增或者自减。

public static AtomicLong nextNumber = new AtomicLong();
long id = nextNumber.incrementAndGet();
这里的incrementAndGet是原子方式,获得值、增加1然后设置成新的值的操作不会被中断,保证了线程安全。
还可以使用compareAndSet来实现更复杂的操作。

public static AtomicLong largest = new AtomicLong();
long observed = getObserved();
do{
	long oldValue = largest.get();
	long newValue = Math.max(oldValue, observed);
}while(!largest.compareAndSet(oldValue, newValue));
如果另一个线程也在更新largest,就可能阻止这个线程更新,compareAndSet就会返回false,不会设置新值。这时循环会尝试更新,读取更新后的值,知道修改成功,即compareAndSet返回true。在Java8中可以使用lambda表达式来更新变量,相对来说就更简介。
largest.updateAndGet(x -> Math.max(x, observed);
largest.accumulateAndGet(observed, Math::max);
以上两种方法均可。

Java8新增加

除了上面的updateAndGet和accumulateAndGet以外,还有getAndUpdate和getAndAccumulate实现返回原值。而当大量线程访问相同的原子值,性能会大幅下降,所以Java8提供了LongAdder和LongAccumulator来解决该问题。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值