[Java 进阶面试题] CAS 和 Synchronized 优化过程
最有用的东西,是你手里的钱,有钱就有底气,还不快去挣钱~
文章目录
- CAS 和 Synchronized 优化过程
- 1. CAS
- 1.1 CAS的原理
- 1.2 CAS实现自增自减的原子性
- 1.3 CAS实现自旋锁
- 1.4 CAS针对ABA问题的优化
- 2. synchronized
- 2.1 synchronized加锁阶段分析
- 2.2 synchronized优化
CAS 和 Synchronized 优化过程
1. CAS
1.1 CAS的原理
CAS的具体操作是,有一个变量值i为A,想要将值A修改为新值B.
1.compare: 比较 if( i == A ).
2.swap : 如果相等,就把i的值改为B
3.返回此操作是否成功
CAS操作具有原子性,即这三个操作会通过一个指令完成三条操作,在一定程度上规避了线程安全问题.
1.2 CAS实现自增自减的原子性
如下代码,AtomicInteger,AtomicLong等类运用了CAS机制,实现变量自增自减的原子性.
a.getAndIncrement(); //a++
a.getAndDecrement(); //a–
a.incrementAndGet(); //++a
a.decrementAndGet(); //- -a
a.addAndGet(3); //a += 3
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicInteger;
public class MyAtomicInteger {public static void main(String[] args) throws InterruptedException{//AtomicInteger,AtomicLong,AtomicBoolean,AtomicIntegerArrayAtomicInteger a = new AtomicInteger(0);Thread t1 = new Thread(()->{a.getAndIncrement(); //a++a.getAndDecrement(); //a--a.incrementAndGet(); //++aa.decrementAndGet(); //--aa.addAndGet(3); //a += 3});Thread t2 = new Thread(()->{a.getAndIncrement();});t1.start();t2.start();t1.join();t2.join();System.out.println(a.get());}
}
1.3 CAS实现自旋锁
如下图,是CAS实现自旋锁的伪代码
while(!CAS(this.owner,null,Thread.currentThread()))
1.线程owner初始化为null
2.进入循环,先判断线程owner是否为null,如果owner不为空,代表owner正在被其他线程占用,则需要阻塞等待.
3.线程解锁后,又被设为null,这时可以把当前线程赋值给owner.
1.4 CAS针对ABA问题的优化
CAS的核心机制,检查变量i和旧值A是否相等,但如果变量i中途被修改了,后来又恢复成了A,系统是无法察觉的.
例如去银行取钱,原来1000,要取出500.银行系统慢,这个人多点了两下取钱键.
1.先比较钱数是否为1000,是,取出500.
2.但取钱的同时有位有人给卡充了500,使钱恢复成了1000
3.系统第二次比较,发现钱是1000,又取出了500
很明显,在这卡bug呢.
优化机制
给操作加一个版本号,每执行一次操作,版本号加1.执行的次数以版本号为主.就不会出现执行多次的情况
2. synchronized
2.1 synchronized加锁阶段分析
synchronized加锁有一个过程
1.无锁状态
2.偏向锁,先给要加锁的对象一个标记,看对象是否存在锁竞争,若执行过程中没有出现锁竞争,在执行synchronized之后取消偏向锁即可.如果出现另外的线程去竞争锁,需要迅速把偏向锁升级成真正的加锁状态.
3.轻量级锁,当synchronized发生锁竞争时,偏向锁升级为轻量级锁(加锁方式为自旋锁).
4.如果一直拿不到锁,自旋了一定时间后,锁就会升级为重量级锁(挂起等待锁).进入阻塞队列等待,直到锁被释放,线程才有机会获取锁.
注意:锁只能升级,没办法降级.
2.2 synchronized优化
1.锁清除
对对象加锁后,编译器可以去自动判定,若当前场景不需要加锁,编译器会把锁清除.
2.锁粗化
如果一段代码中,出现了多个锁,加锁解锁频繁,并且每个锁之间距离很近.这时可以用一个大锁直接包含这些小锁,减少频繁加锁解锁的开销.
本文完
相关文章:
[Java 进阶面试题] CAS 和 Synchronized 优化过程
最有用的东西,是你手里的钱,有钱就有底气,还不快去挣钱~ 文章目录CAS 和 Synchronized 优化过程1. CAS1.1 CAS的原理1.2 CAS实现自增自减的原子性1.3 CAS实现自旋锁1.4 CAS针对ABA问题的优化2. synchronized2.1 synchronized加锁阶段分析2.2 synchronized优化CAS 和 Synchroniz…...
算法思想 - 贪心算法
本文主要介绍算法中贪心算法的思想: 保证每次操作都是局部最优的,并且最后得到的结果是全局最优的。贪心思想相关题目分配饼干455. Assign Cookies (Easy)Input: [1,2], [1,2,3] Output: 2Explanation: You have 2 children and 3 cookies. The greed factors of 2 …...
解决需求变更难题的8大方案
需求变更8大原因为什么会出现需求变更,这是由于需求约束、规则有了新的变化、由于政策发生变化,客户、沟通方式、流程化、标准化的问题等导致。这里在在过去的项目经验中,提出了常见的8大需求变更的原因。政策发生变化:指由于国家…...
NSSROUND#8[Basic]
文章目录一、[NSSRound#8 Basic]MyDoor二、[NSSRound#8 Basic]Upload_gogoggo三、[NSSRound#8 Basic]MyPage四、[NSSRound#8 Basic]ez_node一、[NSSRound#8 Basic]MyDoor <?php error_reporting(0);if (isset($_GET[N_S.S])) {eval($_GET[N_S.S]); }if(!isset($_GET[file])…...
Vue3代码初体验找不同
文章目录🌟 写在前面🌟 代码分析🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相关技术文章,Vue 框架目前的地位大家应该都晓…...
opencv调取摄像头录制
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...
html标签手册
完整的HTML页面📑 ①基础标签📑📑📑 HTML <!DOCTYPE> 声明 !DOCTYPE声明必须是 HTML 文档的第一行,位于 html标签之前。 !DOCTYPE 声明不是 HTML 标签;它是指示 web 浏览器关于页面使用哪个 HTML 版…...
SpringMVC--视图、RESTful案例、处理AJAX请求
SpringMVC的视图 SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户 SpringMVC视图的种类很多,默认有转发视图和重定向视图 当工程引入jstl的依赖,转发视图会自动转换为JstlView 若使用的视图技术为…...
一个同学升了leader,今年活还没干,他就已经想好组里成员的两次绩效考核怎么打了,还说:leader都是这样的!...
绩效是大家都比较关注的事情,那么作为领导,一般是怎么打绩效的呢?一位网友爆料:一个大学同学升了leader,前段时间跟他吃饭,他说他已经想好了今年组里成员的两次绩效考核怎么打了。该网友有点吃惊࿰…...
Docker 面试知识点
Docker 是什么? 是实现容器技术的一种工具是一个开源的应用容器引擎使用 C/S 架构模式,通过远程API 来管理 (我们本机是 C,docker 引擎是 S,实际的构建过程是在 docker 引擎下完成的)可以打包一个应用及依赖包到一个轻量级、可移植的容器中 …...
C++高级篇学习笔记
文章目录 前言 本文记录C一些面试难点问题剖析。 1. 左右值和右值引用的作用 左值:可以在左边,表达式结束后依然存在的持久对象,一般有名字,可以取地址。 提示: 前置自加/自减 可以做左值; 右值在右边&a…...
gentoo基本安装过程
该文章是本人在gentoo官方安装文档的基础上简单总结的,也是本人自己实践过的,目前本人用的就是gentoo,对于真的需要安装gentoo的朋友,建议还是参考官方文档,说的比较详细,这个可以简单看看,可以…...
【LeetCode】1234. 替换子串得到平衡字符串
1234. 替换子串得到平衡字符串 题目描述 有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,…...
[动手写操作系统]-01-开机运行系统
文章目录 **概念和目标**概念目标理论源码概念和目标 概念 assembler: 汇编程序BIOS: BIOS(Basic Input Output System,基本输入输出系统)是个可编程的微型操作系统,用于管理计算机中的软硬件,它控制着系统的启动,系统是如何连接外部设备,怎样响应,调整相应操作,都是…...
最长回文子序列问题
最长回文子序列问题 问题描述:给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。 子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 注意是子序列而不是子…...
月薪11k!从财务专员到软件测试工程师,成都校区小哥哥用三个月实现转行换岗
好久没和大家分享学员的转行经历了,或许在一些人看来他们的故事与自己无关,但同样也能引起一些人的共鸣,可以帮助到那些陷于就业焦虑的同学找到目标和方向。相仿的年龄、相同的职业、相似的压力…在转行软件测试追求更好生活的路上࿰…...
Android 逆向工具大整理,碉堡了
文章目录jadx打开 gui 界面把安装包打开双击变量名和方法名可以高亮所有出现的地方**强大的搜索功能****搜索资源****查看 APK 签名****查看 APK dex 数,方法数****查看资源,配置清单****展开包名**查找方式引用反混淆导出 Gradle 工程导出反编译资源lib…...
二维数组的定义
1. 概念二维数组就是一种数组的数组,其本质上还是一个一维数组,只是它的数据元素又是一个一维数组。如果你对这个概念想象不出来,给大家举个栗子,相信吸烟的同学一下子就会明白。一根烟 一个变量一包烟 20根烟 一维数组一条烟 …...
SpringMVC--获取请求参数、域对象共享数据
SpringMVC获取请求参数 通过ServletAPI获取 将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请 求的请求报文的对象 RequestMapping("/testParam") public String testParam(HttpServletRequest request){S…...
2月13日,30秒知全网,精选7个热点
///深圳支持数字经济核心区试点,市民每月免费享有1T网络流量支持基础电信企业、广电企业及互联网企业加快推进全市内容分发网络(CDN)扩容及智能改造行动,优化和完善CDN节点部署,积极利用边缘计算技术,推动互…...
【C++设计模式】学习笔记(2):模式分类与模版方法 Template Method
目录 简介模式分类GOF-23 模式分类从封装变化角度对模式分类重构获得模式 Refactoring to Patterns重构关键技法“组件协作”模式Template Method 模式动机(Motivation)结构化软件设计流程面向对象软件设计流程早绑定与晚绑定模式的定义结构(Structure)要点总结结语简介 He…...
【Swift 60秒】92 - Nil coalescing
0x00 Lesson The nil coalescing operator unwraps an optional and returns the value inside if there is one. If there isn’t a value - if the optional was nil - then a default value is used instead. Either way, the result won’t be optional: it will either b…...
python pip安装的包的路径
以ubuntu为例从一个店家那里拿到的一个ubuntu环境中,同时安装了python3.6和python2.7,又安装了ros,最后pip安装包的位置很混乱,安装的包不知道安装在了哪里。使用vscode的时候需要代码提示,就得找到包的路径࿰…...
个人收藏学习
【默认收藏夹】 CompletableFuture使用详解(全网看这一篇就行) 从头开始学MySQL-------存储过程与存储函数(4) 聊聊支付流程的设计与实现逻辑 聊聊消息中心的设计与实现逻辑 SpringBoot2 整合JTA组件,多数据源事务管理…...
【C++】类和对象---需掌握的功能
目录1.初始化列表1.1构造函数赋值1.2初始化列表格式:编译器执行的顺序:特性:1.3explicit关键字类型替换过程多参数构造函数类型替换(C11)2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时…...
2.12、进程互斥的软件实现方法
学习提示: 理解各个算法的思想、原理结合上小节学习的 “实现互斥的四个逻辑部分”,重点理解各算法在进入区、退出区都做了什么分析各算法存在的缺陷(结合 “实现互斥要遵循的四个原则” 进行分析) 1、单标志法 算法思想:两个进…...
Java面试题-数据库
数据库相关 MySQL的索引使用 默认会有主键索引。 索引分类:单值索引、复合索引、唯一索引 详细文章 MySQL explain 分析 MySQL通过explain关键字分析SQL的执行计划。(Oracle通过EXPLAIN PLAN FOR sql) IDSELECT_TYPETABLEPARTITIONSTYPEPOSS…...
select 与 where、group by、order by、limit 子句执行优先级比较
当 select 和 其他三种语句的一者或者多者同时出现时,他们之间是存在执行先后顺序的。 他们的优先级顺序是:where > group by > select > order by > limit 目录 1、select 与 where 2、group by 与 where 、select 2、select 与 order…...
【Docker】用开源umami监控你的站点访问量
新年到,祝大家兔年吉祥!🎉 1.介绍 umami是一个开源的站点访问量监看程序,其支持docker部署到自己的服务器上。相比较百度等收费的网站信息监看,这种方式对于小站长来说更加实惠一些 2.docker安装的坑 2.1 docker-co…...
java环境配置
java环境配置步骤下载jdk安装jdk配置环境变量通过控制台命令验证配置是否成功大功告成安装教程: https://blog.csdn.net/m0_37220730/article/details/103585266 下载jdk 若不理解JDK/JRE/JVM的关系,可以点此查看初识Java(概念、版本迭代、…...
网站建设规划方案ppt/抖音自动推广引流app
/ 网站根路径 ./ 当前路径 ../ 上一级路径 ../../ 上两级路径 例如:本地静态网站 index页面地址 127.0.0.1/bootstrap_test/index.html在这里页面里面引入css和js路径应该怎么写呢? 1、 <link href"css/bootstrap.min.css" rel"style…...
长春网站制作价格/百度搜索引擎盘搜搜
为什么80%的码农都做不了架构师?>>> IT技术潮流从来没有想今天这般风云变幻,城头变幻大王旗。对于科技人才来说,这是最好的时代,也是最坏的时代。新技能和工具的不断涌现对个人的学习能力是个极大的挑战,同…...
北京市保障性住建设投资中心网站首页/java培训学费多少钱
代码如下:import openpyxl #导入第三方库openpyxl,该库只支持xlsx格式的excel文件wbopenpyxl.load_workbook(r"D:甥敳獲AdministratorDesktop转厂_国内出货_进度报表_202006132151.xlsx") #加载桌面的文件,并赋值给wbprint("工作簿的所…...
装修公司网站开发/中国营销网
C操作符的优先级 C操作符的优先级 操作符及其结合性 功能 用法 L L L:: :: ::全局作用域 类作用域 名字空间作用域::name class::name namespace::nameL L L L L. -> [] () ()成员选择 成员选择 下标 函数调用 类型构造object.member pointer->member variable[exp…...
网站平台建设包括哪些/seo搜索引擎优化营销案例
1. 在实际工作中,您可以给工作簿设置编辑权限密码,让工作簿只允许观看而避免被误编辑。首先点击左上角的文件选项卡。 2. 然后在左侧的快捷命令区,选择另存为命令。 3. 接着点击浏览按钮,打开另存为设置窗口。 4. 在弹出的另存为窗…...
网站建设的技巧有哪些方面/武汉seo托管公司
引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…...