Java中的13个原子操作类

  • 2019 年 11 月 9 日
  • 笔记

说明:本篇文章是在阅读《Java 并发编程艺术》过程中的一些笔记和分析 文章来源:https://www.iteye.com/blog/xiaoheng-2509522

该项目的地址:https://github.com/xiaoheng1/concurrent-programming

欢迎有兴趣的小伙伴加入,一起讨论、分析,共同进步!

atomic 包中的 13 个类,属于 4 中类型的原子更新方式.

  • (1)原子更新基本类型
  • (2)原子更新数组
  • (3)原子更新引用
  • (4)原子更新属性

atomic 包里的类基本都是使用 Unsafe 实现的包装类.

1.原子更新基本类型

  • (1) AtomicBoolean
  • (2) AtomicInteger
  • (3) AtomicLong

本类以 AtomicInteger 进行讲解:

int addAndGet(int delta) 以原子方式将输入的数值与实例中的值相加,并返回结果

boolean compareAndSet(int expect, int update) 如果输入的数值等于预期值,则以原子的方式将该值设置为输入的值.

int getAndIncrement() 以原子方式将当前值加 1,注意,这里返回的是自增前的值.

void lazySet(int newValue) 最终会设置成 newValue,使用 lazySet 设置值后,可能导致其他线程在之后的一小段时间内还是可以读到 旧值.

int getAndSet(int newValue) 以原子方式设置为 newValue 的值,并返回旧值.

getAndIncrement 是如何实现原子操作的了?

public final int getAndIncrement() {      for (;;) {          int current = get();          int next = current + 1;          if (compareAndSet(current, next))              return current;      }  }

我们可以看到,它的实现原理是死循环 + CAS.

2.原子更新数组

  • (1) AtomicIntegerArray 原子更新整形数组里的元素
  • (2) AtomicLongArray 原子更新长整形数组里的元素
  • (3) AtomicReferenceArray 原子更新引用类型数组里的元素

AtomicIntegerArray 类提供方法如下:(1) int addAndGet(int i, int delta) 以原子方式将输入值与数组中的索引 i 的元素相加 (2) boolean compareAndSet(int i, int expect, int update) 如果当前值等于预期值,则以原子方式将数组位置 i 的元素设置成 update 值.

3.原子更新引用类型

原子更新基本类型的 AtomicInteger, 只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类.

  • (1) AtomicReference 原子更新引用类型
  • (2) AtomicReferenceFieldUpdate 原子更新引用类型里的字段
  • (3) AtomicMarkableReference 原子更新带有标记位的引用类型.

推荐阅读

为什么redis哨兵集群只有2个节点无法正常工作?

Spring Boot 集成 Ehcache 缓存,三步搞定!