乐观锁算线程同步吗?

悲观锁是查询时加锁,然后下面的流程锁住,别的线程不可以访问,当前面的线程完成后释放锁,这是让线程同步了。那乐观锁,算同步吗,因为两个线程还是可以同时查询,只是修改时,version不对的会被打回?

算同步,但它是"不堵门的同步"。

你的观察非常准确------这是理解两种锁本质区别的关键。


同步 ≠ 必须阻塞等待

同步的本质 是:协调多个线程对共享资源的访问,保证最终结果正确。

至于怎么协调,有两种思路:

悲观锁 乐观锁
策略 先假设会冲突,提前堵门 先假设不会冲突,事后检查
协调方式 阻塞式同步 --- 没轮到的线程挂起等待 非阻塞式同步 --- 失败的线程自己重试或放弃
线程体验 "都给我排队,一个一个来" "你们都去试,撞车了自行解决"

为什么乐观锁也算同步?

回到你的审核场景:

复制代码
线程A查询 → 状态待审核,版本=1
线程B查询 → 状态待审核,版本=1

线程A提交 → UPDATE ... WHERE 版本=1 → 成功,版本变成2
线程B提交 → UPDATE ... WHERE 版本=1 → 失败(版本已经是2了)

虽然 A 和 B 同时查到了旧数据 ,但数据库最终只让 一个线程修改成功

这就是同步------系统通过版本号机制,在写操作这一步强制达成了"同一时刻只有一个线程能真正修改成功"的效果

另一个线程被打回,要么重试(重新查询最新版本再改),要么直接报错退出。


一句话总结

悲观锁 = 同步靠"保安堵门"(互斥)
乐观锁 = 同步靠"事后对账"(冲突检测)

两者都解决了竞态条件,只是悲观锁在入口处排队,乐观锁在出口处筛选。最终都是让系统从"可能同时审核两次"变成"只会审核一次"。

相关推荐
云烟成雨TD5 小时前
Spring AI Alibaba 1.x 系列【69】Token 用量统计
java·人工智能·spring
JAVA9655 小时前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试
在繁华处5 小时前
Java从零到熟练(四):面向对象基础
java·开发语言
Unbelievabletobe5 小时前
解决了股票api接口盘后数据更新慢的问题
大数据·开发语言·python
不会C语言的男孩6 小时前
C++ Primer 第2章:变量和基本类型
开发语言·c++
小江的记录本6 小时前
【JVM虚拟机】堆内存分代模型:年轻代(Eden+Survivor)、老年代、元空间Metaspace(附《思维导图》+《面试高频考点清单》)
java·前端·jvm·后端·python·spring·面试
在繁华处6 小时前
Java从零到熟练(三):流程控制
java·开发语言·python
唐青枫7 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java
一起学开源7 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
云泽8087 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法