page contents

说一下 atomic 的原理?

小柒 发布于 2022-10-25 13:57
阅读 578
收藏 0
分类:高并发架构
4360
王昭君
王昭君
Atomic 包中的类基本的特性就是在多线程环境下,当有多个线程同时
对单个(包括基本类型及引用类型)变量进行操作时,具有排他性,
即当多个线程同时对该变量的值进行更新时,仅有一个线程能成功,
而未成功的线程可以向自旋锁一样,继续尝试,一直等到执行成功。
AtomicInteger 类的部分源码:
// setup to use Unsafe.compareAndSwapInt for updates(更新操作时提供比较并替换
的作用)
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }}
private volatile int value;
AtomicInteger 类主要利用 CAS (compare and swap) + volatile
native 方法来保证原子操作,从而避免 synchronized 的高开销,执
行效率大为提升。
CAS 的原理是拿期望的值和原本的一个值作比较,如果相同则更新成
新的值。UnSafe 类的 objectFieldOffset() 方法是一个本地方法,这
个方法是用来拿到原来的值的内存地址,返回值是 valueOffset。另
value 是一个 volatile 变量,在内存中可见,因此 JVM 可以保证
任何时刻任何线程总能拿到该变量的最新值。
请先 登录 后评论