码迷,mamicode.com
首页 > 其他好文 > 详细

乐观锁之版本号机制和CAS

时间:2019-05-11 00:11:56      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:取数据   csdn   有一个   除了   共享   版本号   sdn   bsp   取数   

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

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

乐观锁之版本号机制和CAS

标签:取数据   csdn   有一个   除了   共享   版本号   sdn   bsp   取数   

原文地址:https://www.cnblogs.com/cwb123/p/10847043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!