技术文摘
悲观锁与乐观锁简述
2025-01-15 02:44:13 小编
悲观锁与乐观锁简述
在多线程编程和并发控制的领域中,悲观锁与乐观锁是两种重要的机制,它们为数据的安全访问与操作提供了保障。
悲观锁,从名字就可以看出其秉持着一种“悲观”的态度。它假定在对数据进行读写操作时,大概率会出现并发冲突。所以,在操作数据之前,悲观锁会先获取锁,将数据锁定,防止其他线程同时访问。就如同在银行办理业务,顾客进入一个封闭的小房间,在整个办理业务期间,这个房间被锁住,其他顾客不能进入,直到当前顾客办理完业务释放房间。常见的数据库中的行锁、表锁等都属于悲观锁的范畴。使用悲观锁虽然能有效避免并发冲突,但在高并发场景下,大量线程等待锁的释放,会导致性能下降,因为线程阻塞会消耗系统资源。
乐观锁则截然不同,它持有“乐观”的心态。乐观锁认为在大多数情况下,并发操作不会发生冲突。在数据被读取时,并不会对其进行锁定。只有在数据更新的时候,才会去检查在读取数据之后,到更新数据之前,这段时间内数据是否被其他线程修改过。比如在版本控制中,给数据记录一个版本号,每次读取数据时获取当前版本号,更新数据时,会比对当前版本号和数据库中的版本号是否一致,如果一致则进行更新,并更新版本号;若不一致,说明数据已被修改,更新操作会失败。乐观锁在高并发读多写少的场景中表现出色,因为它减少了锁的争用,提高了系统的并发性能。不过,若冲突频繁发生,频繁的更新失败会带来额外的开销。
悲观锁和乐观锁各有优劣。在实际应用中,开发者需要根据具体的业务场景、并发访问模式以及数据的特性来合理选择使用哪种锁机制,以达到性能与数据一致性的最佳平衡。
- 高效唯一标识符
- DDD 领域驱动设计的工程化落地之道
- Istio 好用至极,搞微服务别再只选 Spring Cloud
- 基于 React-Cropper-Pro 的图片裁切压缩与上传实现
- Gitlab 动态子流水线的实践探索
- 《技术写作指南:助程序员早下班》
- GitLab 在 CockroachDB 与 YugabyteDB 上兼容性对比之系统初始化
- 面试突击:请求转发与请求重定向的区别,你是否明白?
- 搭建脚手架的经验分享,你掌握了吗?
- 提升 Go 语言开发效率的若干技巧,你掌握了多少?
- 从全局视角设计秒杀系统的方法
- Java 中字符串截取的多种操作
- 权限系统的精妙设计,令人称赞
- 无需 Javascript 能否与浏览器交互?
- Spring Boot 配置属性的类型安全,您是否知晓?