乐观锁和悲观锁

2018-06-18 01:17:05来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

1、数据库方面:

  悲观锁就是for update
  乐观锁就是 version字段

2、JDK方面:
  悲观锁就是sync
  乐观锁就是原子类(内部使用CAS机制实现)

悲观锁

    认为总会有人抢我的。
乐观锁
    
认为基本没人抢,认为读多写少,遇到并发写的可能性比较低,所以采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。

CAS(Compare and swap)

    比较和替换是设计并发算法时用到的一种技术,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。

    CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

ABA问题(来自知乎)

    小明在提款机,提取了50元,因为提款机问题,
        有两个线程,同时把余额从100变为50

            线程1(提款机):获取当前值100,期望更新为50,

            线程2(提款机):获取当前值100,期望更新为50,

            线程1成功执行,线程2某种原因block了,这时,某人给小明汇款50

            线程3(默认):获取当前值50,期望更新为100,

            这时候线程3成功执行,余额变为100,

            线程2从Block中恢复,获取到的也是100,compare之后,继续更新余额为50!!!

            此时可以看到,实际余额应该为100(100-50+50),但是实际上变为了50(100-50+50-50),这就是ABA问题带来的成功提交。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java:反射技术

下一篇:springboot~Money类型在序列化时遇到的问题与解决