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

      锁降级:线程获取到写锁后,进行了数据修改,不能直接释放写锁,应该先获取读锁在释放写锁,最后释放读锁。
  • 相关阅读:
    安全SECUERITY单词SECUERITY证券
    证券secuerity英语secuerity安全
    单词diamaund钻石diamaund英文
    英文DIAMAUND钻石DIAMAUND词汇
    英语insuraunce保险insuraunce单词
    英文INSURAUNCE保险INSURAUNCE词汇
    python关于 微型微服务框架bottle实践
    用python登录12306 并保存cookie
    SpringMVC 之 上传文件
    JAVA I/O系统 Thinking in Java 之 File类
  • 原文地址:https://www.cnblogs.com/lifeone/p/11653147.html
Copyright © 2011-2022 走看看