20240227

乐观锁和悲观锁

悲观锁:认为线程安全问题一定会发生,因此在操作数据之前先获取锁,确保线程串行执行,例如Synchronized、Lock都属于悲观锁。

乐观锁:认为线程安全问题不一定会发生,因此不加锁,只是在更新数据时去判断有没有其它线程对数据做了修改,若未修改则认为是安全的,自己才更新数据;若已经被其它线程修改说明发生了安全问题,此时可以重试或异常。

乐观锁实现的两种方式:

版本号法:

以黑马点评为例的原理图如下

在每一次进行修改操作时,需判断数据是否被修改过,这里对数据库字段增加了版本号,对数据进行一次修改操作,则版本号加1,上图中线程1修改后版本号变为2,每次在修改操作判断时,查询条件使用的版本号为上一次查询数据的版本号。

CSA法:

以黑马点评为例的原理图如下

该方法在修改前直接根据所需查询的数据是否相较于上一次查询到的值发生变化,从而判断是否有其他线程修改过数据,上图中线程1、2在进行修改操作前判断时查询条件为:所需修改的字段=该线程上一次查询到该字段数据的数值。

CAS方法存在一定弊端,虽然能解决超卖问题,但会导致失败率大大增加,例如线程a查询到的stock值为10,完成查询后,中间有5个线程紧接着进行查询,这5个线程查完后,线程a进行修改,此时由于stock为10,与初次查询的是一样的,因此执行修改操作,stock减1变为9,此时后面5个线程进行修改操作判断时,查询条件中的stock仍为10,而数据库中stock的值为9,因此此时认为别的线程对该值进行了修改,故这些线程的修改操作会失败。

此时的优化方法:stock条件设置为stock > 0,表示每一次判断是否大于0,满足时再修改。

全部评论

相关推荐

BG:211本硕非科班 无实习 无论文 无奖项到家事业群timeline:3.23 笔试4.3 一面4.9 二面4.11 无oc 直接发的邮件offer一面:(1h)手撕:删除链表重复元素II项目拷打:(20分钟)黑马点评项目 主要围绕redis与数据库一致性秒杀的超卖和一人一单的问题八股(20分钟)mysql有几种索引?聚簇索引和非聚簇索引有什么区别?mysql有几种隔离级别?可重复读和可串行化是如何实现的?可串行化加的是什么锁?可重复读是怎么解决幻读的?如果存在一个10e条数据 如何基于某几个类型进行查询并优化?(细节:一张表  10e条    列:编号、主键id、名称、类型)sql题: 班级、学生、成绩三张表 输出每个班级得分前10的学生你用过哪些垃圾回收器?简述一下CMS垃圾回收的步骤?G1的垃圾回收器步骤?现在有一个students.java的文件 他又int string list的属性 我们加载到内存里面 最终的形态是怎么样子的?什么在常量池?什么在堆里?List放在哪里呢?类加载分几步?准备是干什么的?线程池有几种拒绝策略?时间不够了 没反问2面(1h) 全程闲聊 (编程40分钟 闲聊20分钟)自我介绍什么时候能来实习?能实习多长时间?两道编程题:1、二叉树层序遍历2、复原IP地址    (没做出来 最后讲了一下思路)  (美团二面编译器真难用)一道 思维题:1、 一箱苹果 一箱橘子 一箱苹果和橘子 每个箱子上都有自己标签,如果这三个标签全部贴错了,问你从哪个标签的箱子里拿出一个水果,能判断出这个三个箱子真正装的是什么?最近有学习什么新技术或者新知识?目前记忆最深刻的知识点是什么?最近有读过什么技术书籍?有什么兴趣爱好?你期望base在哪个城市?反问:部门业务怎么提高自己? 多看源码 多从深度上提升自己。二面全程闲聊,看牛客上大家说闲聊一般都寄了 没想到最后拿到了本人第一个offer谢谢大家牛客上的面经!!最后希望大家都能拿到自己满意的暑期实习offer!!#美团#
点赞 评论 收藏
转发
1.实习项目中redis分布式锁是怎么做的?2.socket用的什么协议?3.war包往tomcat中什么地方放?4.集合了解有多少Collection集合的继承体系?5.Map保证线程安全怎么用?6.HashTable算保证线程安全的类吗?7.ConcurrentHashMap和HashTable考虑线程安全和性能考虑哪一个?8.创建一个线程有哪些方式?7.CompletableFuture有什么了解?8.contdownLunch?9.实现线程安全有什么方式?10.Synchronize和lock选择哪一个比较合适?11.在使用线程池的时候使用ThreadLocal会有什么的问题(内存泄露可以控制,防止数据的错误使用,使用完后及时把ThreadLocal清除掉)?12.聊一聊springIOC?13.spring支持多少中注入?14.spring官方更推荐哪一种注入方式,最新的呢?15.一个接口有多个实现类,通过那种注入方式将多个实现类注入接口中(@Resource)?16.AOP(一些系统级的功能不用让程序员关注,程序员只需要去关注业务)17.spring里边的通知类型有哪些?18.springAOP的重要应用,springAOP的事务管理(用过吗,怎么用的呢)?19.使用了什么样的注解,如果在有些异常类型的情况下发生回滚,应该怎么做,而不是所有异常下发生回滚?20.spring什么情况下发生事务失效(aop基于动态代理,首先这个对象是个代理对象,才能生效)?21.数据库的四大特性?22.join,leftjoin,rightjoin?23.组合索引有什么了解?24.redis防止缓存雪崩的情况怎么处理?(key的失效时间)25.布隆过滤器,说说他的优缺点?26.有没有用过微服务架构?注册中心和配置中心用的什么?27.nacos配置的自动刷新怎么做的?28.时getwai时,有多少种filter29.微服务间的接口调用怎么做的?(openfen)30.jdk8用的什么垃圾回收机制?31.cms时老年代还是新生代?32.元空间是干嘛的?33.Java应用启动时如何设置堆内存大小?34.栈内存呢?35.一般jvm栈大小设置多少呢?
点赞 评论 收藏
转发
1 5 评论
分享
牛客网
牛客企业服务