深入浅出 Java Concurrency (2): 原子操作 part 1

Java原子操作类汇总

当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同。比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2。这是因为,可能在A线程和B线程执行的时候拿到的i的值都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized能保证多线程不会同时更新变量i.

从java1.5开始,jdk提供了java.util.concurrent.atomic包,这个包中的原子操作类,提供了一种用法简单,性能高效,线程安全的更新一个变量的方式。

atomic包里面一共提供了13个类,分为4种类型,分别是:原子更新基本类型,原子更新数组,原子更新引用,原子更新属性,这13个类都是使用Unsafe实现的包装类。

一、原子更新基本类型

atomic提供了3个类用于原子更新基本类型:分别是AtomicInteger原子更新整形,AtomicLong原子更新长整形,AtomicBoolean原子更新bool值。由于这三个类提供的方法几乎是一样的,因此本节以AtomicInteger为例进行说明。

AtomicInteger的常用方法有:

  1. int addAndGet(int delta):以原子的方式将输入的值与实例中的值相加,并把结果返回
  2. boolean compareAndSet(int expect, int update):如果输入值等于预期值,以原子的方式将该值设置为输入的值
  3. final int getAndIncrement():以原子的方式将当前值加1,并返回加1之前的值
  4. void lazySet(int newValue):最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
  5. int getAndSet(int newValue):以原子的方式将当前值设置为newValue,并返回设置之前的旧值

占位

发布了131 篇原创文章 · 获赞 18 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/u_ascend/article/details/87976585
今日推荐