zoukankan      html  css  js  c++  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的思想也是悲观锁。


    悲观锁使用场景

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

  • 相关阅读:
    证券公司业务部门深度全解
    转:ORM框架
    深入理解Java:注解(Annotation)基本概念
    Java与.net的区别delegate和event
    XML的四种解析器原理及性能比较
    转: LRU缓存介绍与实现 (Java)
    jquery -- checkbox选中无选中状态
    css -- 背景图片自适应屏幕大小
    javascript -- addEventListener()和removeEventListener
    html5 -- audio标签
  • 原文地址:https://www.cnblogs.com/xinruyi/p/11537787.html
Copyright © 2011-2022 走看看