Java 并发——Atomic相关类

https://rainmonth.github.io/posts/J1911174.html

为什么会有Atomic类

在单一的变量上应用对象锁(采用synchronized关键字)、ReentrantLock(可重入锁)有点大材小用了,于是Java针对单一变量就推出了一种lock-free-thread-safe工具集合,这就是Atomic相关类。Atomic相关类实现的核心思想就是CAS(compareAndSet)

1
2
3
4
5
6
7
/**
* @param expect
* @param update
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

其中valueOffset和Atomic类对象的内存地址有关,用来供底层获取Atomic对象当前的值(real值),所以这个过程是有三个值的:

  1. 内存中的实际值real;
  2. compareAndSet执行时期待expect值;
  3. 更新的值update;

更新的条件:
如果内存的值real和expect的值相同,说明符合条件,将update的值写入到内存。那么如果real值和expect不等咋办呢?不相等就一直等待,知道相等为止,这个过程中具有排他性,只有当compareAndSet执行完毕了,其他线程才有机会执行。

所以Atomic实现了高效无锁(不过底层还是用的排它锁,但底层处理比Java层处理效果要好得多),注意他的value字段是volatile的,任何线程修改后都会直接写到主内存中,保证了可见性。

Atomic 相关类

Atomic相关类主要有:AtomicIntegerAtomicBooleanAtomicLong