Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day22】—— 并发编程2

  大家好,我是陈哈哈,北漂五年。相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍热门面试题及恰如其分的解答。

  一眨眼Day20了,依稀记得Day9中说有点慌的小伙伴,不知现在还在不在?还慌不慌😅

  其实,一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!想起高三时一个同学的座右铭:只有沉下去,才能浮上来。共勉(juan)。

在这里插入图片描述
坐标:西安 钟楼

作者:唐伯虎点香烟


车票

  • 面试题1:说一下你对ReentrantLock的理解?
    • 追问1:你认为 ReentrantLock 相比 synchronized 都有哪些区别?
  • 面试题2:解释一下公平锁和非公平锁?
  • 面试题3:能详细说一下CAS具体实现原理么?
    • 追问1:那CAS的缺陷有哪些呢?
    • 追问2:讲一下什么是ABA问题?怎么解决?
  • 每日小结


  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识集合容器并发编程JVMSpring全家桶MyBatis等ORMapping框架MySQL数据库Redis缓存RabbitMQ消息队列Linux操作技巧等。

面试题1:说一下你对ReentrantLock的理解?

  ReentrantLock是JDK1.5引入的,它拥有与synchronized相同的并发性和内存语义,并提供了超出synchonized的其他高级功能(例如,中断锁等候、条件变量等),并且使用ReentrantLock比synchronized能获得更好的可伸缩性。

  ReentrantLock主要利用: CAS(compare-and-swap) + AQS(AbstractQueuedSynchronizer)队列来实现。它支持公平锁和非公平锁,两者的实现类似。

CAS

  CAS(compare-and-swap),见名知意,比较并交换。CASvolatile 关键字是实现并发包的基石。没有CAS就不会有并发包,synchronized是一种独占锁、悲观锁,java.util.concurrent中借助了CAS指令实现了一种区别于synchronized的一种乐观锁。

  CAS引用了乐观锁思想,每次拿数据的时候都认为别的线程不会修改这个数据,所以不会上锁,但是在更新的时候会通过标记参数判断一下在此期间(更新期间)别的线程有没有已经修改过该标记数据,如果发现有其他线程在修改且未修改完成,并不会像悲观锁那样阻塞线程,而是直接返回,可以去选择再次重试获得锁,也可以直接退出。

举个流程示例

  如CAS操作包括三个操作数:需要读写的内存位置(V)预期原值(A)新值(B)。如果内存位置与预期原值的A相匹配,说明在此期间(更新期间)别的线程未修改过该标记数据,那么将内存位置的值更新为新值B。如果内存位置与预期原值的值不匹配,那么处理器不会做任何操作。

  无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。)

AQS:

  AQS主要利用硬件原语指令CAS,来实现轻量级多线程同步机制,并且不会引起CPU上文切换和调度,同时提供内存可见性和原子化更新保证(线程安全的三要素:原子性、可见性、顺序性)。

  AQS的本质上是一个同步器/阻塞锁的基础框架,其作用主要是提供加锁、释放锁,并在内部维护一个FIFO等待队列,用于存储由于锁竞争而阻塞的线程。

追问1:你认为 ReentrantLock 相比 synchronized 都有哪些区别?

优秀问答摘自:https://ask.csdn.net/questions/1101634

两者的共同点:

  1. 都是用来协调多线程对共享对象、变量的访问
  2. 都是可重入锁,同一线程可以多次获得同一个锁
  3. 都保证了可见性和互斥性

两者的不同点:

  1. ReentrantLock 显示的获得、释放锁,synchronized 隐式获得释放锁
  2. ReentrantLock 可响应中断、可轮回,synchronized 是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性;
  3. ReentrantLock 是API 级别的,synchronized 是 JVM 级别的;
  4. ReentrantLock 可以实现公平锁
  5. ReentrantLock 通过 Condition 可以绑定多个条件;
  6. 底层实现不一样, synchronized 是同步阻塞,使用的是悲观并发策略,ReentrantLock 是同步非阻塞,采用的是乐观并发策略;
  7. Lock 是一个接口,而 synchronized 是 Java 中的关键字,synchronized 是内置的语言实现;
  8. synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁。
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {while(条件判断表达式) {condition.wait();}// 处理逻辑
} finally {lock.unlock();
}
  1. Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中断。
  2. 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
  3. Lock 可以提高多个线程进行读操作的效率,就是实现读写锁等。

在这里插入图片描述

雨后

作者:對你何止一句钟意


面试题2:解释一下公平锁和非公平锁?

  ReenTrantLock可以指定是公平锁还是非公平锁,而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获锁

  我们刚才提及到AQS中,如果线程A正处于lock状态,线程B进来时发现线程A处于lock状态,会自动进入阻塞队列,等待取锁;这时候当线程C也进来了也发现线程A处于lock状态,也会自动进入阻塞队列。那么等A释放锁后,下次加锁到底是线程B先拿到还是线程C先拿到呢?

在这里插入图片描述

  ReentrantLock有个构造方法用于设置锁的公平性,如果我们仅仅是new了一个ReentrantLock的话,那么就是非公平锁(默认),就是靠自己去争取,完全的随机性。如果我们在new ReentrantLock(true) 加入 true参数时,公平锁,就会遵循先入先出的原则,保证了锁的公平性。


在这里插入图片描述
课间休息,又来秀一下来自咱们群里同学的搬砖工地,坐标:云南 昆明

作者:艾尼皮卡路


面试题3:能详细说一下CAS具体实现原理么?

  首先,CAS的英文单词是Compare and Swap,即是比较并替换。CAS机制中使用了3个基本操作数:内存地址V旧的预期值A待替换的新值B

  CAS规则是:当需要更新一个变量的值的时候,只有当变量的预期值A和内存地址V中的实际值相同的时候,才会把内存地址V对应的值替换成B。

下面我们通过一个例子来讲解:

  1. 在内存地址V中存储的值是陈哈哈

在这里插入图片描述

  1. 线程01想要把变量的值改成侨总,对于线程01而言,内存地址 V=‘陈哈哈’,旧的预期值 A=‘陈哈哈’,需要替换的新值 B=‘侨总’。

在这里插入图片描述

  1. 在线程01要提交更新之前,另外一个线程02抢先一步,将内存地址V中的值更新成了V='比特币'

在这里插入图片描述

  1. 线程01开始提交更新的时候,按照CAS机制,首先进行A的值与内存地址V中的值进行比较( A=‘陈哈哈’ V=‘比特币’),发现 A != V 中的实际值,提交失败

在这里插入图片描述

  1. 线程01未获取锁后进行重试,重新获取内存地址V的当前值(V=‘比特币’),并重新赋值想要修改的值(B=‘侨总’)。截至目前,线程01旧的预期值为A='比特币',B='侨总',这个重新尝试的过程被称为自旋

在这里插入图片描述

  1. 这一次就比较顺利了,没有其他线程改变该变量的值,所以线程01通过CAS机制,比较旧的预期值A内存地址V的值,相同(V == A),可以替换。

在这里插入图片描述

  1. 线程01进行替换,把地址V(V=‘比特币’)的值替换成B(B=‘侨总’)。

在这里插入图片描述

  以上就是一个比较完整的CAS锁冲突的处理方式。

  从思想上来看,synchronized属于悲观锁,悲观的认为程序中的并发问题十分严重,所以严防死守,只让一个线程操作该代码块。而CAS属于乐观锁,乐观地认为程序中的并发问题并不那么严重,所以让线程不断的去尝试更新,在并发问题不严重的时候性能要比synchronized快。

追问1:那CAS的缺陷有哪些呢?

当然,CAS也有缺点,如ABA问题,自旋锁消耗问题、多变量共享一致性问题等

  1. ABA:

问题描述:

  线程t1将它的值从A变为B,再从B变为A。同时有线程t2要将值从A变为C。但CAS检查的时候会发现没有改变,但是实质上它已经发生了改变 。可能会造成数据的缺失。

解决方法:

  CAS还是类似于乐观锁,同数据乐观锁的方式给它加一个版本号或者时间戳,如AtomicStampedReference

  1. 自旋消耗资源:

问题描述:

  多个线程争夺同一个资源时,如果自旋一直不成功,将会一直占用CPU。

解决方法:

  破坏掉for死循环,当超过一定时间或者一定次数时,return退出。JDK8新增的LongAddr,和ConcurrentHashMap类似的方法。当多个线程竞争时,将粒度变小,将一个变量拆分为多个变量,达到多个线程访问多个资源的效果,最后再调用sum把它合起来。

  虽然base和cells都是volatile修饰的,但感觉这个sum操作没有加锁,可能sum的结果不是那么精确。

  1. 多变量共享一致性问题:

解决方法: CAS操作是针对一个变量的,如果对多个变量操作,

  • 可以加锁来解决。

  • 封装成对象类解决。

追问2:讲一下什么是ABA问题?怎么解决?

ABA:如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A。当前线程的CAS操作无法分辨当前V值是否发生过变化。

举个例子1:

例一:你和女神一起喝茶,女神喝了一半去厕所了,你猥琐的喝了她剩下的半杯,然后又从你杯子里倒了半杯给她,女神回来后也不知道是否被人喝过。

如果觉得例子1太猥琐的话,请看例子2:

例二:

今天上午10:30:00:我银行卡有一万块钱,今天我来ATM机取5000块出来买比特币,但由于ATM机硬件问题,导致取款操作同时提交了两遍,后台开启了两个线程(线程1、线程2),两个线程都是获取当前值10000元,要更新成5000元;理想情况下,应该一个线程更新成功,一个线程更新失败,我的存款只扣除一次,也就是余额应为5000元 。

好巧不巧,也是今天上午10:30:00:侨总上次买币欠我5000块,经过我再三催债,表示再不还钱就把你买币的事儿告诉你媳妇!也正巧这个点儿,侨总给我转了5000元到卡里(线程3)。没想到这再正常不过的事儿,缺被ABA问题坑了!我可忍不了!

事情是这样的:

  1. 线程1首先执行成功,把余额10000更新为5000(取钱线程)。
  2. 同时线程2由于某种原因陷入了阻塞状态(取钱线程)。
  3. 这时候,(线程3)侨总汇款给了我5000元,执行成功,我的账户5000更新为10000元。
  4. 过一会儿,线程2恢复运行,由于之前阻塞的时候获得了当前值为:10000,并且经过compare检测,此时存款也的确是10000元,所以又成功把变量值从10000更新成了5000。
  5. 侨总:哈哥,5000给你打过去了!
  6. 我:查到账户只有5000,你他娘的糊弄老子呢??
  7. 侨总:???我好几十个比特币的人,还在乎你这5000块钱了。。。

  这就是经典的 A → B → A 问题,通过上面的例子,相信同学们也基本了解它的原理了。其实解决方式也很简单,比如例一,我们将每一次倒水假设有一个自动记录仪记录下,这样主人回来就可以分辨在她离开后是否发生过重新倒满的情况。这也是解决ABA问题目前采用的策略。

  使用版本号,通过比较值 + 版本号才判断是否可以替换。这么看来如果要解决ABA问题,就需要在CAS基础上在增加一个版本号的校验,当值 + 版本号都相等时,才进行替换,其他部分均不变。

  而在Java中,AtomicStampedReference类就实现了用版本号做比较的CAS机制。狗子们,你心里有数了么?

每日小结

  今天我们复习了面试中常考的并发编程相关的三个问题,你做到心中有数了么?对了,如果你的朋友也在准备面试,请将这个系列扔给他,如果他认真对待,肯定会感谢你的!!好了,今天就到这里,学废了的同学,记得在评论区留言:打卡。,给同学们以激励。

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

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

相关文章

南京“211”大学毕业生跳楼悲剧 家人在催债声中送别

斯人已逝,余波未了!南京一所211大学的23岁毕业生许阳(化名),8月31日跳下28楼,去世前3个月有34笔网贷申请。 一名从小到大都很优秀的学生,家中相对富足的他,为何会如此频繁申请贷款,又为何走向绝路?《每日经济新闻》记者前往其江苏苏中地区的家乡深入调查。 这是一次…

chatgpt赋能python:Python分离函数介绍

Python分离函数介绍 在Python编程中,函数是一个非常重要的概念。函数的分离是保持代码组织结构清晰的一种方式。一个好的函数设计可以让代码变得易于维护、扩展和重用。本文将介绍Python中如何分离函数。 什么是函数 在Python中,函数是一段可重用的代…

自己动手写chatGPT:神经网络的神经元和损失函数

chatGPT基于所谓的大模型,这里有两个关键词一个是“大”,一个是“模型”,我们先看什么叫“模型”。所谓模型其实就是深度学习中的神经网络,后者由很多个称之为“神经元”基本单元组成。神经元是一种基础计算单元,它执行…

YYC松鼠聚合直播系统源码 融和电商商城、网红热点、娱乐竞技直播等

正文: 松鼠聚合直播系统是一套团队自主研发、源码开源,可自由二次开发的直播系统。系统融和电商商城、网红热点、娱乐竞技直播等,能够快速实现吸粉引流,集合在线直播、互动分享、社交传播等一体化功能,实现“直播”的…

ChatGPT人工智能商业高效实操指南

帮助看见未来的人更快成功 现在,ChatGPT 的时代来了,越来越多的案例佐证,它正在取代人力,并且投入产出 比高到让人无法想象!轻松为企业主省出几十万! 那么人工智能在在商业里面到底扮演了多少个角色呢? 接下来我会告诉你们 1、承担客服工作,客户满意度大大提高 客服无疑是…

ChatGPT已能模仿任何写作风格,让你的自媒体快速起号

我认识的一两个技术大佬目前失业在家,压力不小。对于现在的就业市场来说,再找工作,高不成低不就。他们的薪资,一般企业无法承受,大厂岗位又在缩减。今年真正感受到了寒冬。 对于我们还有饭吃的程序员,现在不…

或许能用 ChatGPT 插件实现财富自由

文章目录 或许能用 ChatGPT 插件实现财富自由1. 认识一下1.1 是什么1.2 怎么用 2. 举个例2.1 Wolfram2.2 Browsing 3. 怎么做到的4. 财富自由4.1 生活类插件4.2 品牌推广类 5. 限制 或许能用 ChatGPT 插件实现财富自由 我们知道,当前 ChatGPT 最大的局限性就是模型…

chatGPT能做职业规划?看完之后发现3年软测白做了

“每天都是重复、单调的工作,收入不理想,想跳槽无力,学习又没有动力和方向,不知道未来的发展在哪里,甚至想转行” 做测试久了,很多人都有诸如此类的疑惑,不想一直停留在测试需求分析&#xff0…

剑指chatGPT,马斯克:你们暂停一下,我追赶追赶

前言 近期,马斯克被曝出购买了大约1万个GPU,并从DeepMind处招募到AI人才,打算开发自己的大语言模型(LLM)项目。 啥是GPU,就是图形处理器。一般用于构建大型语言模型所需。 GPU价格不菲,以英伟…

ChatGPT早报新闻5.6

2023.5.6早报 1.苹果的ChatGPT哪去了?库克的回应很谨慎 凤凰网科技讯北京时间5月5日消息,面对ChatGPT和其他聊天机器人的爆红,苹果公司CEO蒂姆库克表达了谨慎的看法。 库克在第二财季财报电话会议上称,人工智能(AI)的潜力“…

突发!李开复成立公司亲自下场抢人!宣布新公司目标不只是中文ChatGPT,资金算力已到位......

点击“开发者技术前线”,选择“星标” 让一部分开发者看到未来 来自AI前线 继王慧文、王兴之后,又一大佬宣布进军 AI 大模型赛道。 李开复宣布筹办新 AI 公司, 剑指 AI 2.0 3 月 19 日,创新工场董事长兼 CEO 李开复发朋友圈宣布成…

畅谈ChatGPT将在教育领域所引发的变化,深刻思考教育该如何转变和应对

最近最火的,非ChatGPT莫属。 ChatGPT,简单来说就是一台“地表最强聊天机器人”,智商高达147。和它聊天时,它能精准判断你的用意,给出你期待的答案,因为它具备一定的逻辑和常识。用过它的人都惊叹它拥有堪比…

王佑镁等|“阿拉丁神灯”还是“潘多拉魔盒”:ChatGPT教育应用的潜能与风险...

点击上方蓝色文字关注我们 作者简介:王佑镁,博士,教授,博士生导师,温州大学大数据与智慧教育研究中心主任(浙江温州 325035);王旦、梁炜怡,硕士研究生,温州大…

ChatGPT引发的对教育的思考

就最近特别火的那个PT,特别值得所有的家长,所有的中年人应该去关注,大概三周前我玩了一下这个PT,我觉得这确实是一个颠覆性的技术,就是说人工智能,或者我们说AI的算法,它已经能做到这个程度&…

ChatGPT专题|为什么ChatGPT这么强?—— 一文读懂ChatGPT原理!

前言 最近一周多的时间,只要不是生活在火星,喜欢技术的同学一定都被OpenAI的ChatGPT给刷屏了。ChatGPT与以往的公开提供服务的对话机器人相比,性能有了显著的提高。它可以相对可靠地提供一些日常对话、知识获取的功能,也可以它根据…

【图像加密】基于matlab GUI正交拉丁方+二维Arnold置乱图像加密【含Matlab源码 813期】

⛄一、正交拉丁方置乱及二维Arnold置乱简介 0 引言 随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要。通常应用于数字图像通信的两种保护技术为:数字水印技术和图像加密技术。前一种保护技术因不改变图像的可见性而不适合…

ChatGPT自己会选模型了!微软亚研院+浙大爆火新论文,HuggingGPT项目已开源

©作者 | 桃子 Britta 来源 | 新智元 「贾维斯」已来!微软亚研院和浙大推出了一个大模型协作系统HuggingGPT,让ChatGPT协调HF社区模型,处理各种多模态任务能力超强。 ChatGPT引爆的AI热潮也「烧到了」金融圈。 近来,彭博社的研…

华人一作DragGAN爆火!拖动你的GAN:交互式图像编辑新高度

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>【GAN和扩散模型】微信技术交流群 转载自:机器之心 | 编辑:蛋酱、小舟 如果甲方想把大象 P 转身,你只需要拖动 GAN 就好了。 在图像生成领…

魔戒啊魔戒,请帮我解开CDM的“数据魔法”

关注我们牛年牛气冲天 4月16日,被誉为魔幻电影鼻祖的《指环王》三部曲,将陆续以4K版登上国内IMAX银幕。那令人震撼而又陶醉的魔幻世界重新归来了。 在现实世界中,在看似枯燥乏味的数据中,是否也存在魔法呢?下面&#x…

医疗ChatGPT、金融GPT都来啦!“潘多拉的魔盒”已经打开?

源|学术头条 AIGC(AI Generated Content)即人工智能生成内容。近期爆火的 AI 聊天机器人 ChatGPT,以及 DallE 2、Stable Diffusion 等文生图模型,都属于 AIGC 的典型案例,它们通过借鉴现有的、人类创造的内…