使用Atomic

我们以AtomicInteger为例,它提供的主要操作有:

  • 增加值并返回新值:int addAndGet(int delta)
  • 加1后返回新值:int incrementAndGet()
  • 用CAS方式设置:int compareAndSet(int expect, int update)

Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。它的主要原理是利用了CAS:Compare and Set。

如果我们自己通过CAS编写incrementAndGet(),它大概长这样:

我们利用AtomicLong可以编写一个多线程安全的全局唯一ID生成器:

  1. class IdGenerator {
  2. AtomicLong var = new AtomicLong(0);
  3. return var.incrementAndGet();
  4. }
  5. }

通常情况下,我们并不需要直接用do … while循环调用compareAndSet实现复杂的并发操作,而是用incrementAndGet()这样的封装好的方法,因此,使用起来非常简单。

在高度竞争的情况下,还可以使用Java 8提供的LongAdderLongAccumulator

  • 原子操作实现了无锁的线程安全;

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

使用Atomic - 图1