zoukankan      html  css  js  c++  java
  • 06 CAS的原理和AQS

    CAS的原理

    CAS(compareAndSwap),比较交换,是一种无锁的原子算法。

    Cas(value,expect,newValue),如果vaule和ecpect一样,就更新为newValue,否则什么也不做,返回false

    实现原理

    通过调用unsafe.compareAndSwapInt(this, valueOffset, expect, update),之后该方法中调用虚拟机中的本地方法和底层操作系统进行操作

    Cas带来的问题

    • 循环时间太长

      如果长时间得不到锁,会进行不断的循环,给cpu带来非常大的开销

      解决方法:在JUC中限制了cas自旋的次数,例如BlockingQueue的SynchronousQueue
    • 只能保证一个共享变量的原子性
      对于多个共享变量,这能使用锁
    • ABA问题
      当原来的值为A,变成B,然后又变为A,那么Cas检查时会发现没有变化,实质上已经发生过变化,这就是ABA问题。
      解决方法:每次变化的时候加版本号,使用AtomicStampedReference

    AQS

    是实现自定义锁的一个辅助类,提供了获取锁和释放锁的功能模板。

    排它锁 共享锁
    acquire(int flag)
    以独占的模式获取对象,忽略中断
    acquireShared(int arg)
    以共享模式获取对象,忽略中断
    tryAcquire(arg)
    试图以独占模式获取对象
    tryAcquireShared(int arg)
    试图以共享模式获取对象
    release(int arg)
    以独占模式释放对象
    releaseShared(int arg)
    以共享模式释放对象

    jdk提供的锁

    • ReentrantLock(支持锁的重入、公平锁和非公平锁)
    • ReentrantReadWriteLock

      锁降级:线程获取到写锁后,进行了数据修改,不能直接释放写锁,应该先获取读锁在释放写锁,最后释放读锁。
  • 相关阅读:
    api.js
    vue开关
    vue 单选框自定义
    vue 笔记
    Flutter 检测网络连接 监听网络变化
    lutter 调用原生硬件 Api 实现扫码
    flutter 支付宝支付流程以及用 Flutter 在 Android Ios 中实现支付宝支付
    js+css 动效+1的效果
    Vue -- filters 过滤器、倒计时效果
    移动端如何实现两行点点点?
  • 原文地址:https://www.cnblogs.com/lifeone/p/11653147.html
Copyright © 2011-2022 走看看