常见锁策略,CAS,synchrodized原理讲解

news2024/11/14 20:48:50

  • 🎥 个人主页:Dikz12
  • 📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香
  • 欢迎大家👍点赞✍评论⭐收藏

目录

常见锁策略 

 乐观锁和悲观锁

轻量级锁和重量级锁

自旋锁和挂起等待锁

 读写锁

公平锁和非公平锁

CAS 

 ​编辑

 ABA问题

synchronized原理

synchronozed,属于哪种锁?

锁升级

 锁消除

锁粗化 


常见锁策略 

 乐观锁和悲观锁

 这是"锁的一种特性",并不是一把具体的锁!乐观,悲观是对后续锁冲突是否激烈给出的预测.

乐观锁: 如果预测接下来的锁冲突的概率不大,就可以少做一些事情,就称为"乐观锁".

悲观锁: 如果预测接下来的锁冲突的概率很大,就要多做一些事情,就称为"悲观锁".

轻量级锁和重量级锁

 轻量级锁: 锁的开销比较小.

重量级锁: 锁的开销比较大.

乐观锁,通常是可以看作轻量级锁    悲观锁,通常可以看作重量级锁.(也是存在特殊情况的)

一个是预测锁冲突的概率,一个是实际消耗的开销.

自旋锁和挂起等待锁

 自旋锁,就是一种轻量级锁的典型实现.

比如: 使用一个while循环,不停的检查当前锁是否释放,如果没有释放,就继续循环,释放了获取锁,从而结束循环.(忙等,消耗cpu换来了更快的响应速度).

挂起等待锁: 就属于重量级锁的一种典型实现.

要借助系统api来实现,一旦出现锁竞争,就会在内核中触发一系列的动作.(比如让这个线程进入阻塞状态,暂时不参与cpu调度).

 读写锁

这里的读写锁跟前面"事务"里的给读加锁 和 给写加锁 不是一样的概念.

速写锁,是加锁操作,分成读锁 和写锁.

两个线程加锁过程中:

1: 读锁和读锁之间,不会产生竞争.

2.读锁和写锁之间,会有竞争.(线程安全问题)

3.写锁和写锁之间,也会有竞争.

公平锁和非公平锁

 

CAS 

Compare and swap 简称 CAS. 比较交换的是 内存 和 寄存器.

CAS,就是一个cpu指令,单个的cpu指令,是原子的!就可以使用CAS完成一些操作,进一步替代"加锁".

也就是基于CAS实现线程安全的方式,也称为"无锁编程".

 优点:保证了线程安全,同时避免了阻塞.

 缺点: 1.代码比较复杂,不好理解

           2.适合于特定的场景,不如加锁方式更普适.

 

 原子类里面是基于CAS来实现的!!!

CAS是通过重试的方式,避免穿插; 加锁则是通过阻塞的方式,避免穿插.

 ABA问题

 CAS 进行操作的关键,是通过值"有没有发生变化" 来作为"没有其它线程穿插执行"的判断依据.

在极端情况下,也是会出现问题的.比如: 把值从A- > B ->A,针对第一个线程来说,看起来好像是这个值没变,实际上已经被穿插执行了.

 解决上诉问题:

只要让判定的数值,按照一个方向增长即可.  (有增有减,就可能出现ABA)

针对像账户余额这样的操作:

 可以引入一个额外的变量,版本号,约定每次修改余额,都要让版本号自增.

在使用CAS的时候,就不是直接判定余额,而是判定版本号.

synchronized原理

synchronozed,属于哪种锁?

1.对于"乐观悲观"是自适应的.

2.对于"轻量和重量"是自适应的.

3.对于"自旋和挂起等待"是自适应的.

4.不是读写锁.

5.是可重入锁 .

6.是非公平锁

 

锁升级

设计JVM的大佬就把synchronized 设置成了 无锁  偏向锁  轻量级锁  重量级锁 这四种状态.

 

当你加锁的时候会先进入偏向锁的状态,如果出现"锁竞争"的可能性就立刻升级成轻量级锁, 也就是真正意义上的加锁.

偏向锁:

 锁消除

 

锁粗化 

 synchronized 里头,代码越多,就认为锁的粒度越粗;代码越少,锁的粒度越细.

 

粒度细的时候,能够并发执行的逻辑更多,更有利于充分利用多核cpu资源.

但是,如果粒度细的锁,被反复加锁,解锁可能实际效果还不如粒度粗的锁. (涉及到锁竞争问题)

 

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

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

相关文章

【ctfshow—web】——信息搜集篇1(web1~20详解)

ctfshow—web题解 web1web2web3web4web5web6web7web8web9web10web11web12web13web14web15web16web17web18web19web20 web1 题目提示 开发注释未及时删除 那就找开发注释咯,可以用F12来查看,也可以CtrlU直接查看源代码呢 就拿到flag了 web2 题目提示 j…

【数据结构】顺序表实现的层层分析!!

关注小庄 顿顿解馋◍˃ ᗜ ˂◍ 引言:本篇博客我们来认识数据结构其中之一的顺序表,我们将认识到什么是顺序表以及顺序表的实现,请放心食用~ 文章目录 一.什么是顺序表🏠 线性表🏠 顺序表 二.顺序表的实现&#x1f3e0…

ShardingSphere 5.x 系列【14】广播表、单表

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1.广播表1.1 概述1.2 案例演示1.2.1 环境准备1.2.2 配置1.2.3 测试2. 单表2.…

2024年.NET框架发展趋势预测

.NET框架仍然是全球开发人员的编程基石,为构建广泛的应用程序提供了一个通用的、强大的环境。微软对创新的坚定承诺见证了.NET的发展,以满足技术领域不断变化的需求。今年,在更广泛的行业运动、技术进步和开发者社区反馈的推动下,…

记一次:Python的学习笔记五(Django集成swagger)

上一篇集成在了gatway上了,但给别人使用swagger的时候还是没有文档,如何集成swagger呢? python版本:Python 3.11.5 Django版本:4.2.7 0、Swagger 文档介绍 Swagger 是一种用于 RESTful API 的开源框架,…

2种方法,教你使用Python实现接口自动化中的参数关联

通常在接口自动化中,经常会参数关联的问题,那么什么是参数关联? 参数关联就是上一个接口的返回值会被下一个接口当做参数运用,其中Python中可以实现参数关联的方法有很多种,今天小编给大家介绍下,如何通过…

SQL Server ID 自增不连续、删除数据后再次插入ID不连续

背景 当我们使用SQL Server 进行数据库操作时,经常会把 Table 的 ID 设置成主键自增 PRIMARY KEY IDENTITY,但是这样做存在一个问题就是 当我们删除一行数据后,再次添加后会看到ID的顺序不连续,如下所示。 查询一下:…

冲突管理最佳实践

任何团队都无法避免冲突,如何有效管理冲突,将冲突转化为团队成长和凝聚的动力,是任何一个团队管理者的必修课。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 冲突在任何组织中都不可避免&…

排序第三篇 直接插入排序

插入排序的基本思想是: 每次将一个待排序的记录按其关键字的大小插入到前面已排好序的文件中的适当位置, 直到全部记录插入完为止。 一 简介 插入排序可分为2类 本文介绍 直接插入排序 它的基本操作是: 假设待排充序的记录存储在数组 R[1……

【鸿蒙 HarmonyOS 4.0】状态管理

一、介绍 资料来自官网:文档中心 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状…

【Linux】普通用户sudo失败怎么办

普通用户,sudo失败报错怎么办 问题分析如何解决成功 问题分析 新建的普通用户sudo失败 sudo提权,是以root的身份执行命令。 当我们用sudo提升权限的时候,这里有个问题,Linux会提示我们输入当前普通用户的密码——这就有点不好。…

骨传导耳机哪个品牌比较好?精选五大倍受好评的机型推荐!

近几年大家对保护听力健康的意识也越来越强烈了,骨传导耳机作为保护听力健康的不二之选,使用的人也越来越多,但是,在面对市场上鱼龙混杂的产品时,还是有很多人不知道该怎么去挑选一款性能优秀的骨传导耳机,…

[TCP] TCP/IP 基础知识词典(2)

我想统计一下,TCP/IP 尤其是TCP协议,能搜到的常见的问题,整理起来,关键词添加在目录中,便于以后查阅。 目前预计整理共3篇: [TCP] TCP/IP 基础知识问答 :基础知识 [TCP] TCP/IP 基础知识问答&…

硬盘坏了数据恢复怎么做?记好这2个方法!

“前段时间我的电脑硬盘出了点问题,不知道为什么就坏了。硬盘坏了数据恢复应该怎么做呢?请大家分享几个好用的方法吧!” 在数字化时代,硬盘作为数据存储的核心组件,其重要性不言而喻。然而,硬盘损坏是一个常…

【知识分享】自动化测试首选接口自动化?

在分层测试的“金字塔”模型中,接口测试属于第二层服务集成测试范畴。 相比UI自动化测试而言,接口自动化测试收益更大,且容易实现,维护成本低,有着更高的投入产出比。因此,项目开展自动化测试的首选一般为接…

记阿里云mysql丢表丢数据的实践记录

第一时间挂工单,联系工程师指引,现在回过来想,第一时间要确认发生时间。 1.通过性能视图(马后炮的总结,实际凭记忆恢复了三四次才找到数据) 2.先恢复数据 通过Navicat工具,结构同步&#xff0…

Vscode vim 插件使用Ctrl+C和V进行复制粘贴到剪切板

Vscode vim 插件使用CtrlC和V进行复制粘贴到剪切板 使用这一个插件的时候复制粘贴和其他软件互动的时候体验不好, 并且不可以用Ctrl c, Ctrl v很不爽 "vim.commandLineModeKeyBindings": [{"before" : ["Ctrl", "c"],"after&q…

C#,动态规划(DP)丢鸡蛋问题(Egg Dropping Puzzle)的三种算法与源代码

1 扔鸡蛋问题 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时&#xf…

3.deeplabv3+的深层网络结构的实现

在第一篇文章中我们提到“在encoder部分,主要包括了backbone(DCNN)、ASPP两大部分”,在这里的backbone就是mobilenetv2网络结构和xception网络结构,而ASPP结构就是深层网络结构,其网络结构如下:…

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…