乐观锁算线程同步吗?

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

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

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


同步 ≠ 必须阻塞等待

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

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

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

为什么乐观锁也算同步?

回到你的审核场景:

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

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

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

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

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


一句话总结

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

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

相关推荐
小小洋洋9 分钟前
OpenWrt 从U盘迁移到内置 eMMC,并完成扩容与 Docker 安装
java·docker·eureka
SomeB1oody30 分钟前
【RustyML入门】2.0. 经典机器学习
开发语言·后端·机器学习·rust·教程
就改了35 分钟前
SpringBoot 自定义线程池 + 实时监控指标
java·spring boot·后端
plainGeekDev42 分钟前
运行时获取依赖 → 编译时注入
android·java·kotlin
0566461 小时前
Python高级——解释器执行原理与虚拟环境工程化实战
开发语言·python
HJX_07242 小时前
嵌入式软件C语言八股文复习笔记5——编译、链接与底层硬核机制
c语言·开发语言·笔记
玖石书2 小时前
ASP.NET Core 迁移至 Spring系列:类库框架篇
java·后端·asp.net
笨蛋不要掉眼泪2 小时前
RabbitMQ消息队列:延迟消息
java·rabbitmq·java-rabbitmq
笨鸟先飞的橘猫3 小时前
c++面向对象编程
开发语言·c++
小玮看世界3 小时前
[Python]自动驾驶感知与决策练习题 (1-10)
开发语言·python·自动驾驶