• 乐观锁之版本号机制和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问题;

  • 相关阅读:
    C#(16进制数据之间的转换)
    解决windows7您当前无权访问该文件夹的问题
    获取本周的周一和周日
    在GridView中使用Cache
    在C#中完成海量数据的批量插入和更新
    母版页中对控件ID的处理
    PostgreSQL函数和运算符(二)
    js检查首字符是否是英文字符
    Asp.net Ajax实现拖放实战
    js移除数组中指导位置元素
  • 原文地址:https://www.cnblogs.com/cwb123/p/10847043.html
Copyright © 2020-2023  润新知