1 CAS
什么是CAS?
CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操 作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新 为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位 置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。
CAS
1、概念
CompareAndSet CompareAndSwap:一种无锁的原子操作,乐观锁思想:给你一个期望值,与你现在的值相比,如果相等再修改,不相等什么事情都不做CAS(V, E, N)
2、作用及优点
CAS实现稍微有点复杂,无锁,不存在阻塞,提高了效率、CPU的吞吐量,性能好
3、缺点
无法察觉过程中是否有变化
4、改进
AtomicStampedReference:增加了时间戳
5、CAS应用的场景
-
- 应用于简单的数据计算
- 线程冲突少的场景
如在多线程中实现自增,会出现线程安全问题,要解决这个问题,需要通过加锁的方式,调整如下:
public class Counter { private int count; public Counter(){} public synchronized int getCount(){ return count; } public synchronized void increase(){ count++; } }
这类似于悲观锁的实现,我需要获取这个资源,那么我就给他加锁,别的线程都无法访问该资源,直到我操作完后释放对该资源的锁。我们知道,悲观锁的效率是不如乐观锁的,上面说了Atomic下的原子类的实现是类似乐观锁的,效率会比使用 synchronized 关系字高,推荐使用这种方式,实现如下:
public class Counter { private AtomicInteger count = new AtomicInteger(); public Counter(){} public int getCount(){ return count.get(); } public void increase(){ count.getAndIncrement(); } }
2 AQS
AQS(AbstractQueuedSynchronizer),AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。这个抽象类被设计为作为一些可用原子int值来表示状态的同步器的基类。如果你有看过类似 CountDownLatch 类的源码实现,会发现其内部有一个继承了 AbstractQueuedSynchronizer 的内部类 Sync 。可见 CountDownLatch 是基于AQS框架来实现的一个同步器.类似的同步器在JUC下还有不少。(eg.Semaphore )
AQS
1、概念:
AbstractQueuedSynchronizer:同步发生器,用于构建锁
2、基本思想
通过内置的FIFO同步队列来完成线程争夺资源的管理工作
3、CLH同步队列
同步发生器内部维护了队列,队列的每个节点都是一个线程