乐观锁和悲观锁

简介: 乐观锁和悲观锁

乐观锁和悲观锁是并发控制的两种不同策略,用于解决多个线程或进程同时访问共享资源时可能出现的数据一致性问题。

悲观锁:

  • 悲观锁的核心思想是假设并发访问会导致数据冲突,因此在访问之前会将资源进行加锁,确保其他线程无法修改数据。
  • 当线程想要访问共享资源时,它会直接获取锁,其他线程需要等待锁被释放才能继续执行。
  • 悲观锁适用于并发冲突较多的情况下,可以保证数据的一致性,但是会降低系统的并发性能。例如对数据更新频繁、冲突概率高的场景,例如数据库中的行级锁。

其主要特点:

  1. 在操作之前获取锁,并在整个操作过程中持有锁,确保只有一个事务能够访问被锁定的资源。
  2. 其他事务需要等待锁的释放才能执行操作,可能会导致一些事务等待时间较长。
  3. 可以保证数据的一致性和安全性,因为同一时间只有一个事务能够修改被锁定的资源。

乐观锁:

  • 乐观锁的核心思想是认为并发访问不会导致数据冲突,因此在线程试图提交数据时才检查是否有冲突。如果有冲突,则回滚并重试。乐观锁适用于并发冲突较少的情况下,可以提高系统的并发性能,但是可能会导致一些重试操作。
  • 在访问共享资源时,并不对其进行加锁,而是通过记录版本号、时间戳等方式标识数据的状态。
  • 当要提交数据时,会比较版本号等信息,如果发现数据已被其他线程修改,则认为发生了冲突,需要进行相应的处理。
  • 乐观锁适用于读操作比写操作频繁、冲突概率低的场景,例如缓存系统中的CASCompare and Swap)操作。

其主要特点:

  1. 在操作之前不获取锁,允许多个事务同时访问同一资源。
  2. 在提交操作时检查是否有冲突,如果有冲突则回滚并重试。
  3. 可以提高系统的并发性能,因为多个事务可以同时执行操作而不需要等待锁的释放。

区别总结如下:

  • 悲观锁假设会有冲突发生,因此在访问资源之前进行加锁,而乐观锁假设不会有冲突发生,只在提交时检查是否有冲突。
  • 悲观锁会阻塞其他线程的访问,直到锁被释放,而乐观锁不会阻塞其他线程的访问,但在提交时可能会回滚或重新尝试。
  • 悲观锁适合于冲突概率高的场景,乐观锁适合于冲突概率低的场景。

需要根据具体的场景和业务需求来选择使用悲观锁还是乐观锁。

 

相关文章
|
Ubuntu 应用服务中间件 项目管理
部署gitlab详解
部署gitlab详解
部署gitlab详解
|
存储 JSON NoSQL
Node.js使用数据库LevelDB:超高性能kv存储引擎
Node.js被设计用来做快速高效的网络I/O。它的事件驱动流使其成为一种智能代理的理想选择,通常作为后端系统和前端之间的粘合剂。Node的设计初衷就是为了实现这一目的,但与此同时,它已成功用于构建传统的Web应用程序:一个HTTP服务器,提供为HTML页面或JSON消息响应,并使用数据库存储数据。
966 0
Node.js使用数据库LevelDB:超高性能kv存储引擎
|
6月前
|
数据采集 算法 数据挖掘
CLIMB自举框架:基于语义聚类的迭代数据混合优化及其在LLM预训练中的应用
英伟达提出的CLIMB框架,是一种自动化优化大型语言模型(LLM)预训练数据混合的创新方法。通过语义嵌入与聚类技术,CLIMB能系统地发现、评估并优化数据混合策略,无需人工干预。该框架包含数据预处理、迭代自举及最优权重确定三大阶段,结合小型代理模型与性能预测器,高效搜索最佳数据比例。实验表明,基于CLIMB优化的数据混合训练的模型,在多项推理任务中显著超越现有方法,展现出卓越性能。此外,研究还构建了高质量的ClimbMix数据集,进一步验证了框架的有效性。
234 0
CLIMB自举框架:基于语义聚类的迭代数据混合优化及其在LLM预训练中的应用
|
IDE Java 开发工具
深入探索安卓应用开发:从环境搭建到第一个"Hello, World!"应用
本文将引导读者完成安卓应用开发的初步入门,包括安装必要的开发工具、配置开发环境、创建第一个简单的安卓项目,以及解释其背后的一些基本概念。通过一步步的指导和解释,本文旨在为安卓开发新手提供一个清晰、易懂的起点,帮助读者顺利地迈出安卓开发的第一步。
390 65
|
10月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-GRU网络的数据分类识别算法matlab仿真
本项目展示了使用MATLAB2022a实现的贝叶斯优化、CNN和GRU算法优化效果。优化前后对比显著,完整代码附带中文注释及操作视频。贝叶斯优化适用于黑盒函数,CNN用于时间序列特征提取,GRU改进了RNN的长序列处理能力。
|
12月前
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
141 4
|
机器学习/深度学习 算法 数据挖掘
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
**摘要:** 了解9种距离和相似度算法:欧氏距离、余弦相似度、汉明距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、雅卡尔指数、半正矢距离和Sørensen-Dice系数。这些算法在机器学习、文本分析、图像处理和生物学等领域各有应用。例如,欧氏距离用于KNN和K-Means,余弦相似度用于文本相似性,汉明距离在错误检测中,曼哈顿距离在数据挖掘,切比雪夫距离在棋盘游戏,闵可夫斯基距离通过调整参数适应不同场景,雅卡尔指数和Sørensen-Dice系数用于集合相似度。每种算法有其优缺点,如欧氏距离对异常值敏感,余弦相似度忽略数值大小,汉明距离仅适用于等长数据。
506 2
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
|
小程序 开发者 Windows
安装VantWeapp开发微信小程序
安装VantWeapp开发微信小程序
368 0
|
缓存 负载均衡 NoSQL
实战:Redis高负载排查记录
实战:Redis高负载排查记录
506 1
|
前端开发 JavaScript API
⚡初识Three.js,在场景中创建一个旋转的正方体~
⚡初识Three.js,在场景中创建一个旋转的正方体~
521 3
⚡初识Three.js,在场景中创建一个旋转的正方体~