zoukankan      html  css  js  c++  java
  • 乐观锁之版本号机制和CAS

    ---恢复内容开始---

      乐观锁:每次去拿数据的时候,都认为别人不会修改,不会加锁,但在更新的时候会去判断一下,此期间别人有没有更新数据,版本号机制和CAS算法就用到乐观锁,参考了https://blog.csdn.net/u011381576/article/details/79922538;

      举一个版本号的例子,

      数据表中除了数据还有一个version字段,更新数据时version字段会加一,

      假设线程A在读取数据和version(version = 1)的期间,有另一个线程B也读取了version(version = 1),

      线程A修改数据,更新version(version = 2),提交更新时,在更新version前读取的version(version = 1)和当前数据表中的version(version = 1)相同,则更新成功

      线程B也修改数据,更新version(version = 2)提交更新时,由于读取时version = 1 而当前数据表version = 2 不相等,则更新失败, 

      CAS 是什么?

      CAS(compare and swap) 比较并交换,有三个操作数,内存地址V ,预期值B,要替换得到的目标子A;

      CAS指令执行时,比较内存地址V与预期值B是否相等,若相等则将A赋给B,(不相等则会循环比较直到相等)整个比较赋值操作是一个原子操作;

      CAS有三个缺点

      1,CAS自旋操作:当内存地址V与预期值B不相等时会一直循环比较直到相等,

      2,只能保证一个共享变量的原子操作,

      3,出现ABA问题:如果内存值初V次读取的时候为A,在将要赋值的时候再次检查还是A,能说明V没有改变过吗?

      有一种可能时当读取内存值V的时候时A,有一个线程将A改为B,后有改为A,CAS会误认为内存值V没有改变,这称为CAS操作的ABA问题;

  • 相关阅读:
    HDU 2544 最短路
    HDU 3367 Pseudoforest
    USACO 2001 OPEN
    HDU 3371 Connect the Cities
    HDU 1301 Jungle Roads
    HDU 1879 继续畅通工程
    HDU 1233 还是畅通工程
    HDU 1162 Eddy's picture
    HDU 5745 La Vie en rose
    HDU 5744 Keep On Movin
  • 原文地址:https://www.cnblogs.com/cwb123/p/10847043.html
Copyright © 2011-2022 走看看