原子操作CAS
2020-08-18 本文已影响0人
策马踏清风
Atom
不可分割的意思,CAS
是一种替换操作,不是锁。
一、原子操作
1.1sync的缺点
- 基于阻塞机制
- 被阻塞的线程优先级很高
- 拿到锁的线程不释放
4.大量竞争消耗cpu
带来死锁等问题
1.2 CAS原理
- 基于指令级别保证是原子操作
- 基本思路:如果内存地址的值和期望值相等,就把新的值赋给此内存地址,否则不进行操作
- 在循环中不断进行
CAS
操作,直到成功(自旋)。
1.3 ABA问题
- 值
A
被改成了B
又被改回了A
。对于一个线程来说,检测到值为A
就以为没有改动过,其实有可能是再次被改回来了。 - 解决方法是加上版本号。
1.4 性能问题
- 如果长期不成功,
cpu
会不断循环
1.5 常用工具
类型 | jdk类 | 备注 |
---|---|---|
基本类型 |
AtomicBoolean AtomicInteger AtomicLong
|
常用getAndIncrement() 先获取后累加,incrementAndGet() 先累加再获取之类的方法。 |
数组 |
AtomicIntegerArray AtomicLongArray AtomicReferenceArray
|
可以理解为数组的引用类型 |
引用类型 |
AtomicReference AtomicMarkableReference AtomicStampedReference
|
AtomicReference 包装一个类,然后调用compareAndSet 进行原子操作替换成另一个类。可以进行整个类的CAS 原子操作。另外两个主要关系ABA 问题,mark 关心是否被动过,stamped 关心动过几次 |
原子更新字段类 |
AtomicReferenceFieldUpdater AtomicIntegerFieldUpdater AtomicLongFieldUpdater
|
比较麻烦,可以用上一个替代 |