原子操作类
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i
=1,A
线程更新i
+1,B
线程也更新i
+1,经过两个线程操作之后可能i
不等于3,而是等于2。因为A
和B
线程在更新变量i
的时候拿到的i
都是1,这就是线程不安全的更新操作,通常我们会使用synchronized
来解决这个问题,synchronized
会保证多线程不会同时更新变量i
。而Java
从JDK
1.5开始提供了java
.util
.concurrent
.atomic
包(以下简称Atomic
包),这个包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。因为变量的类型有很多种,所以在Atomic
包里一共提供了13个类,属于4种类型的原子更新方式,
- 原子更新基本类型
- 原子更新数组
- 原子更新引用和
- 原子更新属性(字段)。
Atomic
包里的类基本都是使用Unsafe
实现的包装类。
原子更新基本类型
- AtomicBoolean:原子更新布尔类型。
- AtomicInteger:原子更新整型。
- AtomicLong:原子更新长整型。
接口与示例
int addAndGet(int delta)
:以原子方式将输入的数值与实例中的值(AtomicInteger里的
value)相加,并返回结果。boolean compareAndSet(int expect,int update)
:如果输入的数值等于预期值,则以原子方式将该值设置为输入的值。