欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

乐观锁之版本号机制和CAS

程序员文章站 2024-01-08 22:33:10
...

乐观锁:每次去拿数据的时候,都认为别人不会修改,不会加锁,但在更新的时候会去判断一下,此期间别人有没有更新数据,版本号机制和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问题;

上一篇:

下一篇: