当前位置: 首页 > news >正文

Java|乐观锁和悲观锁在自旋的时候分别有什么表现?

乐观锁和悲观锁是两种不同的并发控制策略,各自采用不同的机制来处理线程之间的资源竞争。

乐观锁

1. 定义

乐观锁是一种假设冲突不会发生的并发控制策略,通常不对资源进行加锁,而是在操作前不加锁,操作后再进行验证。乐观锁通常通过 CAS(Compare and Swap) 操作实现。

2. 自旋过程
  • CAS 操作: 在乐观锁中,线程在更新某个共享资源时,会使用 CAS 操作。CAS 是一种原子操作,它会检查一个变量的当前值是否等于预期值(旧值),如果相等,则将其更新为新值。
  • 不断尝试: 如果多个线程同时执行 CAS 操作,只有一个线程能够成功更新值,其他线程会失败。失败的线程可以选择:
    • 重试操作,即重新读取数据并尝试再次执行 CAS。
    • 根据具体实现,可能会进行一定的退避策略,减少冲突的可能性。
3. 总结

乐观锁的自旋主要体现在不断进行 CAS 操作,而不是简单地检查锁的状态。线程会尝试进行数据更新,直到成功为止。

悲观锁

1. 定义

悲观锁则假设冲突总是会发生,因此在访问共享资源时会主动加锁,以保护资源不被其他线程访问。

2. 自旋过程
  • 加锁操作: 在使用悲观锁时,线程在访问共享资源之前会尝试加锁。
  • 等待: 如果锁已经被其他线程持有,当前线程会被阻塞(或者在某些实现中可能会自旋等待,取决于具体的锁实现)。
  • 访问资源: 一旦成功获取到锁,线程便可以安全地访问共享资源。
  • 释放锁: 访问完成后,线程会释放锁,以便其他线程可以继续访问。
3. 总结

悲观锁的自旋(如果采用自旋锁的实现方式)主要体现在对锁的状态的检查,线程会反复尝试获取锁。如果采用传统的悲观锁,线程则会被阻塞,而不是自旋。

关键区别

  • 乐观锁:
    • 假设冲突不会发生,采用 CAS 操作进行控制。
    • 适合于读多写少的场景,能够提高并发性能。
  • 悲观锁:
    • 假设冲突会发生,采用加锁的方式进行控制。
    • 适合于写多的场景,确保数据一致性。

总结

  • 乐观锁:通过不断尝试 CAS 操作来更新共享资源,适用于并发较高的环境。
  • 悲观锁:通过加锁和阻塞等待来确保线程安全,适用于高写入冲突的场景。
http://www.lryc.cn/news/468280.html

相关文章:

  • Linux定时器定时任务清理log日志文件
  • 美国大学生数学建模竞赛(MCM/ICM)介绍
  • 【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】
  • 数据仓库宽表概述
  • 在数据库中编程 vs 在应用程序中编程
  • 【设计模式系列】装饰器模式
  • 你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?
  • 一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增
  • 使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML
  • Spring Cache Caffeine 高性能缓存库
  • Python3入门--数据类型
  • 开发运维警示录-20241024
  • Linux运维_搭建smb服务
  • vue3移动端可同时上传照片和视频的组件
  • PyQt入门指南二十七 QTableView表格视图组件
  • AI学习指南深度学习篇-自注意力机制(Self-Attention Mechanism)
  • 【JAVA毕业设计】基于Vue和SpringBoot的校园管理系统
  • 你对MySQL的having关键字了解多少?
  • 【STM32编码器】【STM32】
  • Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型
  • VScode分文件编写C++报错 | 如何进行VScode分文件编写C++ | 不懂也能轻松解决版
  • 洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南
  • Unity3D学习FPS游戏(4)重力模拟和角色跳跃
  • C#基础知识-枚举
  • 系统架构设计师教程 第2章 2.1-2计算机系统及硬件 笔记
  • 通过使用Visual Studio将你的程序一键发布到Docker
  • vue2和vue3动态引入路由,权限控制
  • Spring Boot:植物健康的智能守护者
  • 红黑树 学习笔记
  • linux更改系统时间