技术文摘
悲观锁与乐观锁简述
2025-01-15 02:44:13 小编
悲观锁与乐观锁简述
在多线程编程和并发控制的领域中,悲观锁与乐观锁是两种重要的机制,它们为数据的安全访问与操作提供了保障。
悲观锁,从名字就可以看出其秉持着一种“悲观”的态度。它假定在对数据进行读写操作时,大概率会出现并发冲突。所以,在操作数据之前,悲观锁会先获取锁,将数据锁定,防止其他线程同时访问。就如同在银行办理业务,顾客进入一个封闭的小房间,在整个办理业务期间,这个房间被锁住,其他顾客不能进入,直到当前顾客办理完业务释放房间。常见的数据库中的行锁、表锁等都属于悲观锁的范畴。使用悲观锁虽然能有效避免并发冲突,但在高并发场景下,大量线程等待锁的释放,会导致性能下降,因为线程阻塞会消耗系统资源。
乐观锁则截然不同,它持有“乐观”的心态。乐观锁认为在大多数情况下,并发操作不会发生冲突。在数据被读取时,并不会对其进行锁定。只有在数据更新的时候,才会去检查在读取数据之后,到更新数据之前,这段时间内数据是否被其他线程修改过。比如在版本控制中,给数据记录一个版本号,每次读取数据时获取当前版本号,更新数据时,会比对当前版本号和数据库中的版本号是否一致,如果一致则进行更新,并更新版本号;若不一致,说明数据已被修改,更新操作会失败。乐观锁在高并发读多写少的场景中表现出色,因为它减少了锁的争用,提高了系统的并发性能。不过,若冲突频繁发生,频繁的更新失败会带来额外的开销。
悲观锁和乐观锁各有优劣。在实际应用中,开发者需要根据具体的业务场景、并发访问模式以及数据的特性来合理选择使用哪种锁机制,以达到性能与数据一致性的最佳平衡。
- Vue项目用htmlWebpackPlugins动态配置Favicon后页面空白无法加载的解决办法
- Flex 布局下元素宽度为 0 时怎样防止挤占其他元素空间
- Google 9.0 下 Vue 项目 common.css 里 deep 样式失效的原因
- Vue项目中Common样式文件Deep不生效的原因探讨
- 按钮点击后 :focus 伪类效果为何不消失
- Flex 布局下怎样防止 width: 0 占用元素空间
- 在 VSCode 插件开发里怎样用绝对路径导入 JS 模块
- Element Plus暗黑模式切换秘密:自定义属性实现条件渲染原理
- 出身低微
- Vue CLI下在多个页面引入公共模板的方法
- JavaScript里的生成式人工智能 微软GenAIScript、Svelte Nextjs等
- Element-Plus 中的 属性如何工作
- Element Plus里CSS属性i的含义及用其动态切换图标的方法
- Vue CLI 项目中引入公共 HTML 模板的方法
- 在Vue CLI项目中引入公共模板的方法