• 通俗理解乐观锁和悲观锁


    作者:zhiboer,LiQiyaoo

    链接:

    https://blog.csdn.net/claram/article/details/53959367

    https://blog.csdn.net/L_BestCoder/article/details/79298417

    Java架构师之路做了编排

    乐观锁

          每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。一般使用version方式和CAS操作方式。

    Version方式:

            一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

    核心SQL代码:update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
    

    CAS操作方式:

            即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。

    乐观锁使用场景

          比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

    悲观锁

    每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。在Java中,synchronized的思想也是悲观锁。

    悲观锁使用场景

    比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候都会进行加锁,这样会增加大量的锁的开销,降低了系统的吞吐量。

    往期推荐

     

    【技术篇】 

    【技术篇】 

    【技术篇】 

    640?wx_fmt=jpeg

    Java架构师之路,一个汇聚六万技术人的圈子,让学习之路更有趣!

  • 相关阅读:
    3 面向过程与面向对象进一步比较
    2 类、实例、属性、方法详解
    1 面向对象介绍
    CentOS5、6 NFS的安装配置及mount方法
    js 冒泡 捕获
    js定义类或对象
    new Option()——实现时间联动
    js闭包(转)
    (转)大型网站系统架构的演化
    30款最好的 Bootstrap 3.0 免费主题和模板
  • 原文地址:https://www.cnblogs.com/Java-Road/p/11824669.html
Copyright © 2020-2023  润新知