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

  • 🎥 个人主页: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资源.

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

六、回归与聚类算法 - K-means算法

目录 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法:逻辑回归模型保存与加载无监督学习:K-means算法 1、K-means 聚类步骤 2、API 3、案例 4、性能评估指标 5、总结

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型。随着科技的不断发展,数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分,也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…

学习JAVA的第三天(基础)

目录 流程控制语句 顺序结构 分支结构 循环结构 分类: 练习 跳转控制语句 练习 数组 数组介绍 数组的定义和静态初始化 数组定义 数组的静态初始化 数组元素访问 数组遍历 数组动态初始化 JAVA内存分配 流程控制语句 顺序结构 是Java程序默认的执行流程…

算法——模拟

1. 什么是模拟算法? 官方一点来说 模拟算法(Simulation Algorithm)是一种通过模拟现实或抽象系统的运行过程来研究、分析或解决问题的方法。它通常涉及创建一个模型,模拟系统中的各种事件和过程,以便观察系统的行为&a…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块:管理员登录进入4S…

Apache Flink连载(三十三):Flink基于Kubernetes部署(3)-Kubernetes 核心概念

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Pod 2. Label

智慧公厕是什么?智慧公厕是构建智慧城市的环境卫生基石

随着城市化进程的不断加速,城市人口密度和流动性也逐渐增大,对城市公共设施的需求与日俱增。而在这些公共设施中,公厕作为城市基础设施中不可或缺的一环,对城市的环境卫生和市民生活质量起着举足轻重的作用。如何提高公厕的管理效…

Jmeter基础(1) Mac下载安装启动

目录 Jmeter下载安装启动下载启动 Jmeter下载安装启动 注意⚠️:使用jmeter需要有java环境 下载 官网下载地址:https://jmeter.apache.org/ 会看到这里有两个版本,那么有什么区别么? Binaries是可执行版,直接下载解…

SQL字符集

目标:了解字符集的概念,掌握MySQL数据库存储数据的字符集逻辑以及设置方式 字符集概念 MySQL字符集关系 解决乱码问题 字符集设置原理 1、字符集概念 目标:了解字符集概念,掌握字符集存储和读取的实现原理 概念 字符集:charset或者character set&am…

adb-monkey命令

目录 adb shell monkey -p/-v 包名 次数 1、指定一个包 2、指定多个包 3、不指定包 Event percentages(事件百分比) 常见参数 --throttle 延迟时间 单位毫秒 --pct-touch 设定触屏事件生成的百分比 --pct-motion 设定滑动事件生成…

pyenv

文章目录 一、介绍二、安装步骤1. 安装pyenv2. 配置环境变量3. 安装指定的Python版本4. 设置全局Python版本5. 绑定pip到当前Python版本 三、基本用法 一、介绍 Pyenv是一种Python版本管理工具,它可以让你在同一台机器上安装多个Python版本,并且方便地切…

概率密度函数(PDF)与神经网络中的激活函数

原创:项道德(daode3056,daode1212) 在量子力学中,许多现象都是统计的结果,基本上用的是正态分布,然而,从本质上思考,应该还存在低阶的分布,标准的正态分布是它的极限,这样一来,或许在…

【Git企业实战开发】Git常用开发流操作总结

【Git企业实战开发】Git常用开发流操作总结 大家好 我是寸铁👊 总结了一篇Git常用开发流操作总结的文章✨ 喜欢的小伙伴可以点点关注 💝 现在刚做项目的伙伴,可能你之前学过git,但是一实战发现不熟悉 没关系,看寸铁这篇…

React18原理: React核心对象之Update、UpdateQueue、Hook、Task对象

Update 与 UpdateQueue 对象 1 ) 概述 在fiber对象中有一个属性 fiber.updateQueue是一个链式队列(即使用链表实现的队列存储结构)是和页面更新有关的 2 )Update对象相关的数据结构 // https://github.com/facebook/react/blob/v18.2.0/pa…

2024年上海高考数学备考:历年选择题真题练一练(2014~2023)

今天距离2024年高考还有三个多月的时间,今天我们来看一下2014~2023年的上海高考数学的选择题,从过去十年的真题中随机抽取5道题,并且提供解析。 后附六分成长独家制作的在线练习集,科学、高效地反复刷这些真题,吃透真…

NumPy 基础知识

概括 Numpy 定义了一个N维数组对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块,可以使用索引或切片的方式获取数组中的每个元素。 ndarray 对象有一个dtype属性,该属性用来描述元素的数据类型。 …

【python 的各种模块】(10) 在python3使用turtle 模块画图

目录 1 在anaconda里用python3安装turtle 1.1 因为turtle 本来是适应python2的,所以直接安装报错 1.2 准备好手动下载,官网下载安装包 1.2.1 去官方手册看了下,其实是支持python3的 1.2.2 官网下载,手动安装 1.3 解决办法&…

Linux之用户和用户组

目录 一.简介 二.用户 2.1 添加用户(useradd) 2.2 删除用户账号(userdel) 2.3 修改账户(usermod) 2.4 用户口令管理(passwd) 三. 用户组 3.1 添加用户组(groupadd&…

WRF WPS : namelist 学习笔记

WPS & share 采用ARW方式进行模拟,除了ARW还有NMM,不过科研上常用ARW: wrf_core ‘ARW’最大的嵌套层数为3层,初学者一般是从一层开始逐步加多: max_dom 3 # max_dom 2设置模式开始和结束 的时间,从左到右依次是第一层第二层和第三…

c++笔记理解

1.封装 (1)构造函数不是必须在的 可以通过行为修改属性 (2)private和protected区别在于继承那里要学 (3)类默认是私有,struct是共有 私有的好处:控制数据的有效性,意…