面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你
锁大家都知道吧,多线程访问资源会存在竞争,那么就需要加锁进而让多个线程一个一个访问。
比如有一个房间,一次只能进一个人,现在有十个人都想进去怎么办?
对,加锁。拿一把钥匙,谁抢到钥匙谁就进去,出来后再把钥匙给到剩余的人来竞争
悲观锁:顾名思义,我比较悲观,认为每次访问都会发生竞争,所以需要加锁来保证不会发生竞争。
就像上面10个人总是一起进这个房间。
乐观锁:顾名思义,我很乐观,认为多个线程不会发生竞争,所以就不需要加锁。
就像上面10个人分别在1点到10点来,在房间只呆3分钟就走了,那么就没必要加锁。
那么这个是否会发生竞争,如果鉴别呢? 下面CAS登场了
cas = compare and swap,比较然后再交换。cas 是一个乐观锁
cas涉及到三个变量
- v 要修改的变量,是全局的
- e 期望修改前变量的值
- n 期望修改后的值
比如线程A要对变量V进行修改,首先执行e = get(v),获取变量当前的值,然后执行cas(v,e,n) 这个原子操作。此操作会比较v=e是否成立,如果成立表明没有发生竞争,可以修改变量,如果不成立表明v被修改了,发生了冲突,所以会停止修改。
我们知道e ≠ v 很明显是v被其他线程修改了,发生了竞争。 那么e = v就表明没发生竞争么?
答案显然不是,如果另一个线程将v++ 然后又v— 是不是e = v仍然成立?这个被称作ABA问题
怎么办? 可以对每个变量v附带加上一个时间戳,每次比较时除了比较e = v 再加上一个 etimestamp = vtimestamp即可
当然也有别的版本是新增一个version, 每次修改version++, 然后比较vversion = eversion即可
完整流程如下:
相关文章:
面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你
锁大家都知道吧,多线程访问资源会存在竞争,那么就需要加锁进而让多个线程一个一个访问。 比如有一个房间,一次只能进一个人,现在有十个人都想进去怎么办? 对,加锁。拿一把钥匙,谁抢到钥匙谁就…...
React源码分析3-render阶段(穿插scheduler和reconciler)
本章将讲解 react 的核心阶段之一 —— render阶段,我们将探究以下部分内容的源码: 更新任务的触发更新任务的创建reconciler 过程同步和异步遍历及执行任务scheduler 是如何实现帧空闲时间调度任务以及中断任务的 触发更新 触发更新的方式主要有以下几…...
3功能测试心得分享
1. 登陆、添加、删除、查询模块是我们经常遇到的,这些模块的测试点该如何考虑 (1)登陆 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求,密码不符合要求(格式上的要求) ④ 密码符合要求ÿ…...
Python-推导式
Python 推导式 Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式: 列表(list)推导式 字典(dict)推导式 集合(set)推导式 元组(tuple)推导式 列表推导式 列表推导式格式…...
操作系统线程
进程那一章,我们留下了一个问题 第一个cpu调用进程,进程调用i/o设备,主动进入ready 队列 第二个cpu将程序执行时间平均分时,进程执行时间到 第三个fork函数,我们上一章的lab有实践,可以看出是父进程主动条用…...
vue3中如何定义响应式变量
vue2中定义方式: 熟悉vue2的前端开发小伙伴,都知道定义变量的方式是属于 选项式写法,所有的变量名全都定义在 data(){return { title:‘hello world’}},里,如下图所示: <template><div><h1>{{tit…...
【C++修炼之路】20.手撕红黑树
每一个不曾起舞的日子都是对生命的辜负 红黑树实现:RBTree 前言一.红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质二.红黑树的结构2.1 红黑树节点的定义2.2 红黑树类的封装三.红黑树的插入情况1:只变色情况2:变色单旋情况3:双旋插入的代…...
树状数组(高级数据结构)-蓝桥杯
一、简介树状数组 (Binary Indexed Tree,BIT),利用数的二进制特征进行检索的一种树状结构。一种真正的高级数据结构: 二分思想、二叉树、位运算、前缀和。高效!代码极其简洁!二、基本应用数列a1,a2,....,an,操作:单点修改…...
Flink-多流转换(Union、Connect、Join)
文章目录多流转换分流基本合流操作联合(Union)连接(Connect)基于时间的合流——双流联结(Join)窗口联结(Window Join)间隔联结(Interval Join)窗口同组联结&a…...
kubeadmin安装k8s集群
目录 一 、环境部署 1、服务器规划 2、环境准备 二、所有节点安装docker 1、配置yum源,安装docker 2、配置daemon.json文件 三、所有节点安装kubeadm、kubelet 和kubectl 四、部署k8s集群 1、查看初始化需要的镜像 2、导入镜像 3、初始化kubeadm 3.1 方…...
java3月train笔记
java笔记 day01 一、jdk和idea下载及安装(一般不建议装C盘): jdk:java开发环境 idea:开发工具(软件),用来编写代码的 苍老师文档服务器:doc.canglaoshi.org jdk下载&…...
Apollo Config原理浅析
文章目录1. 简介2. 基本功能3. Apollo关键功能实现原理3.1 框架整体原理3.1.1 Apollo角色3.1.2 框架执行原理3.1.3 整体组成3.2 细节实现3.2.1 Eureka和不同角色机器的关系3.2.2 Meta Server的作用3.2.3 ReleaseMessage消息实现原理3.2.4 Client的通信方式1. 简介 apollo是携程…...
Kubernetes二 Kubernetes之实战以及pod详解
Kubernetes入门 一 Kubernetes实战 本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。 1.1 Namespace Namespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。…...
机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决
问题 1.无法外接显示器 最大的问题就是目前无法外接显示器,因为机械革命大多数型号笔记本电脑的HDMI、DP接口都是直接物理接在独显上的,内屏用核显外接显示器接独显,英伟达独显也是黑苹果无法驱动的,而且发现机械革命tpyec接口还…...
Linux docker(03)可使用GPU渲染的x11docker实战总结
该系列文章的目的旨在之前的章节基础上,使用x11docker构建一个可以使用GPU的docker容器。该容器可以用于3D图形渲染/XR 等使用GPU渲染的程序调试和运行。 0 why docker 为什么非要用x11docker,而不是其他的docker呢? 因为一般的docker是不…...
【Linux操作系统】【综合实验一 Linux操作基础】
文章目录一、实验目的二、实验要求三、实验内容四、实验报告要求一、实验目的 要求掌握Linux基础操作,熟悉Linux行界面,并明白操作的原理以及目的;熟悉Linux系统环境。 二、实验要求 通过这个第一阶段实验,要求掌握以下操作与相…...
关于监控服务器指标、CPU、内存、警报的一些解决方案
文章目录关于监控服务器指标、CPU、内存、警报的一些解决方案Prometheus Grafana 配置 IRIS / Cach 监控服务器Prometheus简介特点架构图Grafana简介特点配置流程自定义Prometheus接口定义配置 Exporter 监控服务器系统资源简介配置流程使用 Alertmanager报警简介配置流程基于…...
vue3全家桶技术栈基础(一)
在认识vue3全家桶之前,先简单回顾一下vue2的全家桶 一.在vue2中,全家桶技术栈 技术栈: vue2 vue-cli vuex3vue-router3webpack elementUI 1.vue-cli 脚手架构建vue项目,CLI 服务是构建于 webpack 和 webpack-dev-server构建快速生成一个vue2的开发项…...
群晖-第2章-设置HTTPS访问
群晖-第2章-设置HTTPS访问 本章介绍如何通过HTTPS访问群晖,前置要求是完成群晖-第1章-IPV6的DDNS中的内容,可以是IPV4也可以是IPV6,或者你有公网IP,直接添加DNS解析也可以。只要能通过域名访问到nas就行。 本文参考自群晖添加SS…...
005 利用fidder抓取app的api,获得股票数据
一、下载安装fidder 百度搜索fidder直接下载,按提示安装即可。 二、配置fidder 1. 打开fidder,选择tools——options。 2. 选择HTTPS选项卡,勾选前三项,然后点击右侧【actions】,选择【trust root certificate】&a…...
OpenClaw+gemma-3-12b-it:多语言文档自动翻译系统
OpenClawgemma-3-12b-it:多语言文档自动翻译系统 1. 为什么需要本地化文档翻译方案 去年参与一个跨国协作项目时,我每天要处理数十份英文技术文档。传统翻译工具要么需要手动复制粘贴,要么存在隐私泄露风险。直到发现OpenClawgemma-3-12b-i…...
Windows Podman磁盘瘦身实战:WSL vhdx文件压缩与空间回收
1. 为什么你的Windows磁盘总是不够用? 最近在帮同事排查一个诡异的问题:他的开发机C盘明明有200GB空间,装了Podman才两个月就频繁报"磁盘空间不足"。检查后发现,WSL的虚拟磁盘文件ext4.vhdx竟然膨胀到了180GBÿ…...
15、深拷贝浅拷贝的区别?如何实现一个深拷贝?
目录 一、先说本质区别 二、从内存角度理解 三、浅拷贝是什么 常见浅拷贝方式 1. Object.assign 2. 展开运算符 ... 3. 数组方法 四、深拷贝是什么 五、常见深拷贝实现方式 1. JSON.parse(JSON.stringify(obj)) 优点 缺点 无法处理: 2. structuredClo…...
如何深度定制WSA环境:Magisk与Google服务集成完全指南
如何深度定制WSA环境:Magisk与Google服务集成完全指南 【免费下载链接】WSA-Script Integrate Magisk root and Google Apps into WSA (Windows Subsystem for Android) with GitHub Actions 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Script 你是否…...
DL基础营 | 第P1周:Pytorch实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊编译器:jupyterlab 一、 前期准备 1. 设置GPU 2. 导入数据 3. 数据可视化 二、构建简单的CNN网络 加载并打印模型 三、 训练模型 1. 设置超参数 …...
3个效率倍增步骤:茉莉花插件让中文文献管理效率提升92%
3个效率倍增步骤:茉莉花插件让中文文献管理效率提升92% 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 茉莉花插件是专…...
机器学习模型配置终极指南:yaml-cpp如何彻底解决参数管理难题 [特殊字符]
机器学习模型配置终极指南:yaml-cpp如何彻底解决参数管理难题 🚀 【免费下载链接】yaml-cpp A YAML parser and emitter in C 项目地址: https://gitcode.com/gh_mirrors/ya/yaml-cpp 在当今的机器学习开发中,YAML配置文件已成为管理复…...
从Python入门到AI项目实战:以NLP-StructBERT部署为第一个完整案例
从Python入门到AI项目实战:以NLP-StructBERT部署为第一个完整案例 你是不是刚学Python,对着书本上的print(“Hello World”)感觉有点无聊?或者学了一堆语法,却不知道这些for循环、if判断到底能用来做什么实际的东西? …...
Promise/A+ 规范:引用不可变 + 核心术语(对象 / 函数)详解
Promise/A 规范:引用不可变 核心术语(对象 / 函数)详解 文章目录Promise/A 规范:引用不可变 核心术语(对象 / 函数)详解前言一、“引用不可变” 是什么意思?二、为什么要强调 “引用不可变”&…...
需要无界云剪在线视频剪辑工具源码的看过来
什么是无界云剪辑 无界云剪是一款无需下载安装,直接打开浏览器就可以在线剪辑视频的在线视频剪辑工具,同时支持服务端合成和前端本地合成两种方式,无界云剪辑主要用于有视频内容生成和编辑需求的第三方系统集成。 界面展示功能非常强大&#…...
