详细剖析乐观锁和悲观锁

乐观锁与悲观锁,本质上是一种思想,体现了从不同角度看待线程同步。在Java和数据库中都有此概念对应的实际应用。

一、悲观锁

悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(例如:Java的synchronized关键字),也可以是对数据加锁(如 MySQL 数据库的排它锁)

Java 5之前的版本,关键字 synchronized 是悲观锁 

Java 5+的 Lock 接口的实现类是悲观锁,线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。

让没有得到锁资源的线程进入阻塞状态,而后在争夺到锁资源后恢复为运行状态,这个过程中涉及到操作系统用户模式和内核模式的互相转换,也叫上下文切换,代价比较高。

二、乐观锁

乐观锁的实现方式主要有两种:CAS机制和版本号机制

1. 轻量级锁 volatile(保证了可见性 + JMM 禁止指令重拍)。

2. 是通过使用无锁编程来实现,最常采用的是CAS算法。

volatile保证了变量的内存可见性。会确保对被声明为 volatile变量的写操作对其他线程立即可见。让每个线程看到的是最新的值,从而避免了多线程环境中的数据不一致问题。 禁止指令重排序:volatile 还可以防止指令重排序优化。在多线程环境下,编译器可能会进行指令重排序以提高性能,但这种重排序可能会破坏程序的预期行为。通过使用 volatile,可以确保指令按顺序执行。 防止编译器优化:volatile 告诉编译器该变量可能会被意外地修改,因此需要使用内存屏障来确保变量的读写顺序符合程序的要求。

Java atomic类的递增操作就通过CAS自旋实现的。假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。


CAS机制使用了3个基本操作数:内存地址V,预期值A,要修改的新值B。

更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。如果不同,说明有别的线程进行了操作,则要更新预期值,循环执行直到成功(自旋)。


CAS的缺点:


     1.CPU开销

较大。在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。
     2.不能保证代码块的原子性。CAS机制所保证的只是一个变量的原子性操作,只能实现变量同步,要保证整个代码块的同步还是需要使用Synchronized。

三、适用场景

悲观锁:适合写操作多的场景,先加锁可以保证写操作时数据正确。
乐观锁:适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。

四、区别

悲观锁阻塞事务;

乐观锁回滚重试。

总结:两者各有优缺点,不能认为一种一定好于另一种,要看具体使用场景来决定。像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行重试,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue3】【vant】 移动端古诗词句子发布收藏项目

更多项目点击👆👆👆完整项目成品专栏 【vue3】【vant】 移动端古诗词句子发布收藏项目 获取源码方式项目说明:其中功能包括素材包含:项目运行环境运行截图 获取源码方式 加Q群:632562109项目说明&#xf…

突破Web3红海,DePIN如何构建创新生态系统?

撰文:TinTinLand 本文来源香港Web3媒体Techub News专栏作者TinTinLand 2023 年 DePIN 赛道的火热成为 Web3 行业的重点关注方向,当前如何以可扩展、去中心化、安全方式推动 DePIN 赛道赋能下的 AI 版图建设,寻找更多 Web3 行业创新机遇成为…

JS(JavaScript)事件处理(事件绑定)趣味案例

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

创新前沿:Web3如何颠覆传统计算机模式

随着Web3技术的快速发展,传统的计算机模式正面临着前所未有的挑战和改变。本文将深入探讨Web3技术的定义、原理以及它如何颠覆传统计算机模式,以及对全球科技发展的潜在影响。 1. 引言:Web3技术的兴起与背景 Web3不仅仅是技术创新的一种&…

QT中的样式表.qss文件

一、前言 qt中样式表的改变有几种方法,第一种就是直接在ui界面对应的组件右键修改样式表,还有一种就是直接在程序里面修改样式表,我知道的还有一种就是qss文件,这个文件就是将在程序中写的修改样式表的语句写道qss文件中&#xff…

次世代霍尔电磁摇杆搭配磁悬浮马达,这款手柄手感超丝滑,谷粒金刚3Pro体验

燥热的天气里,周末在家打上几局游戏,确实更容易放松身心,玩游戏的时候,键鼠、手柄一类的游戏外设特别重要,对我们的游戏体验影响很大,所以挑选起来总是格外挑剔。现在国产的游戏手柄已经今非昔比了&#xf…

grpc学习golang版(八、双向流示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…

【LinuxC语言基础命令】压缩命令

文章目录 前言tar命令zip命令rar命令xz命令总结前言 在日常的开发和维护工作中,我们经常需要对文件进行压缩和解压缩操作,以节省存储空间,方便文件的传输和备份。Linux系统提供了一套完整的压缩和解压缩命令,使得我们可以方便地对文件进行各种操作。本文将介绍一些常用的L…

YouTube广告投放指南:如何投放 YouTube视频广告

在海外广告投放中,YOutube是重要的渠道之一。这篇文章Maskfog将为你介绍Youtube广告类型以及广告投放流程,继续看下去! YouTube 视频广告的类型 1.信息流视频广告 信息流视频广告显示在 YouTube 主页、搜索结果页面上,并作为 Yo…

解释在Android中如何实现本地存储,包括SQLite数据库和SharedPreferences。

在Android开发中,本地存储是不可或缺的一部分,它允许应用程序在用户的设备上保存和检索数据。两种常见的本地存储方式是SQLite数据库和SharedPreferences。下面我将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细解释如何在Android中实现…

餐饮点餐系统

餐饮点餐系统是一款为餐厅和顾客提供便捷点餐服务的在线平台。 1.DDL CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,email VARCHAR(100) UNIQUE…

c++代码行统计程序

前言: 应该每一个学编程的人都很希望知道自己打了多少行代码,而网上又没有好用的统计软件(至少我没找到)。于是我做了一个代码行统计程序。 原理: 由于是上课时打的,只能统计.cpp文件,其它文…

python爬虫之scrapy框架基本使用

python爬虫之scrapy框架基本使用 1、环境安装:pip install scrapy 2、创建一个工程:scrapy startproject xxxPro 3、cd xxxPro 4、在spiders子目录中创建一个爬虫文件:scrapy genspider spiderName www.xxx.com 5、执行工程:scra…

kotlin 携程 withTimeoutOrNull

withTimeoutOrNull 是 Kotlin 协程库中的一个函数&#xff0c;它用于在指定的时间内执行一个协程&#xff0c;如果协程在超时时间内完成&#xff0c;则返回协程的结果&#xff0c;否则返回 null。 函数签名: fun <T> withTimeoutOrNull(timeMillis: Long, block: suspe…

3DEXPERIENCE平台正在推动仿真技术的创新,旨在创造仿真设计的新境界

随着企业数字化转型的不断推进&#xff0c;3DEXPERIENCE 平台正以其前瞻性的技术和服务重塑仿真设计领域的新高度&#xff0c;助力企业实现仿真技术的再次飞跃。该平台不仅整合了先进的仿真工具与设计流程&#xff0c;还促进了跨部门的协作&#xff0c;降低分析仿真对硬件的要求…

QSPI四线SPI:D0、D1、D2、D3

在SPI&#xff08;串行外设接口&#xff09;通信中&#xff0c;D0、D1、D2、D3通常指的是数据线&#xff0c;也叫做数据引脚或通道。这些引脚的使用可能会根据具体设备或配置的不同而有所变化。 标准的SPI通信接口通常包含以下四个主要引脚&#xff1a; MOSI&#xff08;Master…

【第7章】MyBatis-Plus持久层接口之Chain

文章目录 前言一、使用步骤1. query2. update 二、使用提示总结 前言 Chain 是 Mybatis-Plus 提供的一种链式编程风格&#xff0c;它允许开发者以更加简洁和直观的方式编写数据库操作代码。Chain 分为 query 和 update 两大类&#xff0c;分别用于查询和更新操作。每类又分为普…

iptables(10)target(REJECT、LOG)

简介 前面文章介绍iptables的匹配条件,并且已经用到了一些常用动作,比如ACCEPT、DROP、REJECT等。 以下是 iptables 中常用的一些目标(target)及其原理和时机:ACCEPT 原理:允许数据包通过,并停止对后续规则的匹配。 时机:当你想允许特定的数据包通过防火墙时。DROP 原…

远程桌面无法复制粘贴文件到本地怎么办?

远程桌面不能复制粘贴问题 Windows远程桌面为我们提供了随时随地访问文件和数据的便捷途径&#xff0c;大大提升了工作和生活的效率。然而&#xff0c;在使用过程中&#xff0c;我们也可能遇到一些问题。例如&#xff0c;在通过远程桌面传输文件时&#xff0c;常常会出现无法复…

devc++跑酷小游戏4.1.5

导航&#xff1a; Dev-c跑酷小游戏 1.0.0 devc跑酷小游戏1.2.5 devc跑酷游戏1.2.6 devc跑酷游戏2.0.0 devc跑酷游戏2.0.1 devc跑酷游戏2.4.0 devc跑酷小游戏3.5.0 devc小游戏3.8.5 devc跑酷小游戏4.0.0 更新内容: 也没更新多少&#xff0c;改了界面颜色和按钮&#…