为什么会有Atomic类
在单一的变量上应用对象锁(采用synchronized关键字)、ReentrantLock(可重入锁)有点大材小用了,于是Java针对单一变量就推出了一种lock-free-thread-safe
工具集合,这就是Atomic相关类。Atomic相关类实现的核心思想就是CAS(compareAndSet)
1 | /** |
其中valueOffset和Atomic类对象的内存地址有关,用来供底层获取Atomic对象当前的值(real值),所以这个过程是有三个值的:
- 内存中的实际值real;
- compareAndSet执行时期待expect值;
- 更新的值update;
更新的条件:
如果内存的值real和expect的值相同,说明符合条件,将update的值写入到内存。那么如果real值和expect不等咋办呢?不相等就一直等待,知道相等为止,这个过程中具有排他性,只有当compareAndSet执行完毕了,其他线程才有机会执行。
所以Atomic实现了高效无锁(不过底层还是用的排它锁,但底层处理比Java层处理效果要好得多),注意他的value字段是volatile的,任何线程修改后都会直接写到主内存中,保证了可见性。
Atomic 相关类
Atomic相关类主要有:AtomicInteger
、AtomicBoolean
、AtomicLong