zoukankan      html  css  js  c++  java
  • 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同步队列 
          同步发生器内部维护了队列,队列的每个节点都是一个线程
  • 相关阅读:
    内置函数
    Day19 列表生成器、迭代器&生成器
    Day18 高阶函数
    Day17 装饰器
    searchBar 隐藏
    iOS UITableView UIScrollView 的支持触摸事件
    手势冲突UIPanGestureRecognizer 和UIPinchGestureRecognizer
    navigationController 之间的切换
    searchDisplayController 时引起的数组越界
    在适配iPhone 6 Plus屏幕的时候,模拟器上两边有很细的白边如何解决
  • 原文地址:https://www.cnblogs.com/rzbwyj/p/12577268.html
Copyright © 2011-2022 走看看