zoukankan      html  css  js  c++  java
  • CAS

    1、什么是cas

    cas是compareandswap的简称,Java从1.5开始引入乐观锁。

    ABA 问题

    当线程一拿到资源A进行比较的时候,此时线程二刚好也拿到了资源A也开始进行比较,这样线程一和线程二都成功了,但是资源A只加了一,

    为了解决这个问题,在变量前面追加版本号:每次变量更新就把版本号加1,则A-B-A就变成1A-2B-3A。

    2、长时间自旋消耗资源

    自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销

    3、只能保证一个变量的原子操作

    如上图所示,只能保证A得原子操作,如果在多几个变量就不能够使用了。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。

    CAS 的应用

    1.Java的concurrent包下就有很多类似的实现类,如Atomic

    2.自旋锁(ConcurrentHashMap就使用了CAS加synchronized来实现)

    private static final sun.misc.Unsafe U;

    3.令牌桶限流器

    令牌桶限流器 就是系统以恒定的速度向桶内增加令牌。每次请求前从令牌桶里面获取令牌。如果获取到令牌就才可以进行访问。当令牌桶内没有令牌的时候,拒绝提供服务。我们来看看 eureka 的限流器是如何使用 CAS 来维护多线程环境下对 token 的增加和分发的。

    参考文章

     https://blog.csdn.net/ln_6am/article/details/85642853

    https://cloud.tencent.com/developer/article/1462258

  • 相关阅读:
    简述密码
    w命令
    Python打包-Pyinstaller
    [转]油猴Tampermonkey-让百度云下载飞起来
    百度云高速下载Pandownload
    AdoConnect-获取连接字符串 (工具)
    Python爬虫-豆瓣电影 Top 250
    C++中使用ODBC API访问数据库例程
    Python爬虫-什么是爬虫?
    Python+Django(Python Web项目初体验)
  • 原文地址:https://www.cnblogs.com/fuqiang-zhou/p/15053912.html
Copyright © 2011-2022 走看看