常见锁策略,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资源.

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

 

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

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

相关文章

Transformer 架构—Encoder-Decoder

文章目录 前言 一、Encoder 家族 1. BERT 2. DistilBERT 3. RoBERTa 4. XML 5. XML-RoBERTa 6. ALBERT 7. ELECTRA 8. DeBERTa 二、Decoder 家族 1. GPT 2. GPT-2 3. CTRL 4. GPT-3 5. GPT-Neo / GPT-J-6B 三、Encoder-Decoder 家族 1. T5 2. BART 3. M2M-100 4. BigBird 前言 …

每日五道java面试题之spring篇(三)

目录: 第一题 ApplicationContext和BeanFactory有什么区别?第二题 Spring中的事务是如何实现的?第三题 Spring中什么时候Transactional会失效?第四题 Spring容器启动流程是怎样的?第五题 Spring Boot、Spring MVC 和 S…

Sip网络广播号角,sip广播系统公共广播系统有源喇叭

Sip网络广播号角,sip广播系统公共广播系统有源喇叭 SV-7044VP网络有源喇叭,具有10/100M以太网接口,内置高品质扬声器,通过自带放大器播放网络音频,扬声器输出功率高达30W,还支持设置最多10个组播优先区域&…

js如何抛异常,抛自定义的异常

js如何抛异常,抛自定义的异常 最简单的自定义异常 throw "hello" 来自chrome123的控制台的测试 throw "hello" VM209:1 Uncaught hello (匿名) VM209:1 try{ throw "hello";}catch(e){console.log(e);} VM338:1 hello…

nuxt项目搭建

1.先下载nuxt脚手架 yarn create nuxt-app <项目名>&#xff0c;记得安装完项目&#xff0c;npm i,下载node包 目录介绍 components 存放组件分别是头部&#xff08;包含导航&#xff09;和底部 layouts 页面布局&#xff0c;实现一个页面整体架构规则&#xff0c;头…

XTuner InternLM-Chat 个人小助手认知微调实践

要解决的问题&#xff1a; 如何让模型知道自己做什么&#xff0c;是什么样身份。是谁创建了他&#xff01;&#xff01;&#xff01; 概述 目标&#xff1a;通过微调&#xff0c;帮助模型认清了解对自己身份弟位 方式&#xff1a;使用XTuner进行微调 微调前&#xff08;回答…

精致女童时尚穿搭~你想要的我都有哦

不论是版型还是颜色 都绝绝子的一件轻薄外套 整件看着干净利落有设计感 两侧按扣式口袋超级实用的 穿着透气不闷热 搭配各种风格的裤子都一绝

【安卓基础5】中级控件

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全持续更新中&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频…

无线听觉新体验:南卡、韶音、墨觉骨传导耳机综合评测

作为一个资深的跑步爱好者&#xff0c;我几乎离不开音乐的陪伴。不知道大家有没有同感&#xff0c;有时候一首歌曲就是我坚持下去的动力&#xff0c;尤其是在那段艰难的跑步时刻。但是找到一款既能让我在运动中自由呼吸、又能提供优质音乐体验的耳机&#xff0c;并不是一件容易…

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

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

船舶制造5G智能工厂数字孪生可视化平台,推进船舶行业数字化转型

船舶制造5G智能工厂数字孪生可视化平台&#xff0c;推进船舶行业数字化转型。随着数字化时代的到来&#xff0c;船舶行业正面临着前所未有的机遇与挑战。为了适应这一变革&#xff0c;船舶制造企业需要加快数字化转型的步伐&#xff0c;提高生产效率、降低成本并增强市场竞争力…

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

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

就业月薪14K!两年后涨到25K! 考研失败后,这个95年小哥哥成功转行软件测试,人生开挂了!

01 考研连续失败 因为没有特别明确的职业规划&#xff0c;加上内心的学历崇拜情节。大学毕业后&#xff0c;我没有选择参加工作&#xff0c;而是毅然选择了加入考研大军。 备考的日子紧张有序&#xff0c;我也一直在题海里废寝忘食的遨游&#xff0c;本以为能顺顺当当地考上自…

Windows环境下查看磁盘层级占用空间的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

生产环境下,应用模式部署flink任务,通过hdfs提交

前言 通过通过yarn.provided.lib.dirs配置选项指定位置&#xff0c;将flink的依赖上传到hdfs文件管理系统 1. 实践 &#xff08;1&#xff09;生产集群为cdh集群&#xff0c;从cm上下载配置文件&#xff0c;设置环境 export HADOOP_CONF_DIR/home/conf/auth export HADOOP_CL…

vue2和vue3 setup beforecreate create生命周期时间比较

创建一个vue程序&#xff0c;vue3可以兼容Vue2的写法&#xff0c;很流畅完全没问题 写了一个vue3组件 <template><div></div> </template><script lang"ts"> import {onMounted} from vue export default{data(){return {}},beforeCr…

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…

【机器学习的主要任务和应用领域】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 了解机器学习的主要任务和应用领域 知识图谱 机器学习的主要任务可以分为监督学习、无监督学习和半监督学习。 监督学习&#xff1a;这是机器学习中最为常见的一类任务&#xff0c;基于已知类…

R语言数据分析(五)

R语言数据分析&#xff08;五&#xff09; 文章目录 R语言数据分析&#xff08;五&#xff09;前言一、什么是整洁的数据二、延长数据2.1 列名中的数据值2.2 pivot_longer()的处理原理2.3 列名中包含许多变量的情况2.4 列名同时包含数据和变量 三、扩宽数据3.1 pivot_wider的处…

力扣226 翻转二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…