技术文摘
悲观锁与乐观锁简述
2025-01-15 02:44:13 小编
悲观锁与乐观锁简述
在多线程编程和并发控制的领域中,悲观锁与乐观锁是两种重要的机制,它们为数据的安全访问与操作提供了保障。
悲观锁,从名字就可以看出其秉持着一种“悲观”的态度。它假定在对数据进行读写操作时,大概率会出现并发冲突。所以,在操作数据之前,悲观锁会先获取锁,将数据锁定,防止其他线程同时访问。就如同在银行办理业务,顾客进入一个封闭的小房间,在整个办理业务期间,这个房间被锁住,其他顾客不能进入,直到当前顾客办理完业务释放房间。常见的数据库中的行锁、表锁等都属于悲观锁的范畴。使用悲观锁虽然能有效避免并发冲突,但在高并发场景下,大量线程等待锁的释放,会导致性能下降,因为线程阻塞会消耗系统资源。
乐观锁则截然不同,它持有“乐观”的心态。乐观锁认为在大多数情况下,并发操作不会发生冲突。在数据被读取时,并不会对其进行锁定。只有在数据更新的时候,才会去检查在读取数据之后,到更新数据之前,这段时间内数据是否被其他线程修改过。比如在版本控制中,给数据记录一个版本号,每次读取数据时获取当前版本号,更新数据时,会比对当前版本号和数据库中的版本号是否一致,如果一致则进行更新,并更新版本号;若不一致,说明数据已被修改,更新操作会失败。乐观锁在高并发读多写少的场景中表现出色,因为它减少了锁的争用,提高了系统的并发性能。不过,若冲突频繁发生,频繁的更新失败会带来额外的开销。
悲观锁和乐观锁各有优劣。在实际应用中,开发者需要根据具体的业务场景、并发访问模式以及数据的特性来合理选择使用哪种锁机制,以达到性能与数据一致性的最佳平衡。
- Nginx 接口分流的实现浅析
- Nginx 实现 TCP/DUP 流量基于 IP 动态转发的操作办法
- Nginx 中利用 mirror 指令完成接口复制
- Docker 容器频繁重启的解决之道
- 解决 docker-compose 启动的容器一直处于 restarting 状态的问题
- Prometheus 抓取 nginx 访问日志指标详解
- Nginx 内外网端口映射设置详解
- IntelliJ IDEA 里 Docker 的使用方法
- Nginx 实现内网请求转发至外网的示例
- Ubuntu20.04 登录界面鼠标键盘失效的解决办法
- IDEA 与 Docker 集成达成一键部署的全程实现
- DELL 服务器硬盘识别问题的解决之道
- Docker 镜像和容器的导入导出及常用命令应用
- 服务器中虚拟机安装 Nginx 以部署 Web 网页
- 解决 Docker pull 命令拉取镜像失败的方法