文章字数:473,阅读全文大约需要1分钟
Atom不可分割的意思,CAS是一种替换操作,不是锁。
一、原子操作
1.1sync的缺点
- 基于阻塞机制
- 被阻塞的线程优先级很高
- 拿到锁的线程不释放
- 大量竞争消耗
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 |
比较麻烦,可以用上一个替代 |