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

      锁降级:线程获取到写锁后,进行了数据修改,不能直接释放写锁,应该先获取读锁在释放写锁,最后释放读锁。
  • 相关阅读:
    《Web 开发基础》专题系列
    《.NET 编程结构》专题汇总(C#)
    .NET Core:使用BarTender
    .NET Core:过滤器
    .NET Core:中间件
    .NET Core:Api版本控制
    .NET Core:Token认证
    .NET Core:SignalR
    .NET Core:跨域
    .NET Core:Json和XML
  • 原文地址:https://www.cnblogs.com/lifeone/p/11653147.html
Copyright © 2011-2022 走看看