0%

原子操作CAS

文章字数:473,阅读全文大约需要1分钟

Atom不可分割的意思,CAS是一种替换操作,不是锁。

一、原子操作

1.1sync的缺点

  1. 基于阻塞机制
  2. 被阻塞的线程优先级很高
  3. 拿到锁的线程不释放
  4. 大量竞争消耗cpu带来死锁等问题

1.2 CAS原理

  1. 基于指令级别保证是原子操作
  2. 基本思路:如果内存地址的值和期望值相等,就把新的值赋给此内存地址,否则不进行操作
  3. 在循环中不断进行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 比较麻烦,可以用上一个替代