CAS和AQS

Posted rzbwyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAS和AQS相关的知识,希望对你有一定的参考价值。

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同步队列 
      同步发生器内部维护了队列,队列的每个节点都是一个线程

以上是关于CAS和AQS的主要内容,如果未能解决你的问题,请参考以下文章

CAS和AQS

AQS和CAS

06 CAS的原理和AQS

从 synchronized www2015338com到 CAS 和 19908836661AQS

从 synchronized 到 CAS 和 AQS - 彻底弄懂 Java 各种并发锁

CAS和AQS一文搞懂