Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day22,linux内核视频教程

优秀问答摘自: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=‘侨总’。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210708214237642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzkwNTQ1,size_16,color_FFFFFF,t_70#pic_cent

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

er)

  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问题坑了!我可忍不了!

事情是这样的:

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

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

相关文章

百万奖金悬赏大模型不擅长的任务!这 11 个任务模型越大,效果越差!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 去年咱们在介绍百万悬赏时提到,“海量资源砸出的大模型真的会一直那么香吗?”,目前来看,自打 ChatGPT 横空出世引领一众大模型开辟新的生活和工作方式以来,还是挺香的…

三本-安全岗-面经总结(多多面经)

三月之前都不知道暑期实习是什么东西,导致错过很多机会,3月末才迷迷糊糊的准备面试,信息差跟环境真的很重要,周边没一个投暑期实习的同学,学校也没有任何提醒,自己一个人摸爬滚投实习、准备、面试&#xff…

数据万象 | AIGC 存储内容安全解决方案

AIGC(人工智能生产内容) 已经成为与PGC(专业生产内容)、UGC(用户生产内容)并驾齐驱的内容生产方式。由于 AI 的特性,AIGC在创意、个性化、生产效率等方面具有独特的优势,这些优势可以…

没关系,前端还死不了

前言 网络上的任何事情都可以在《乌合之众》书中找到答案。大众言论没有理性,全是极端,要么封神,要么踩死。不少人喷前端,说前端已死?前端内卷?前端一个月800包吃住? 对此我想说,“…

Android程序员秋招就业你准备好了嘛?

前言 秋招即将到了,又到了一年一度的大型“程序猿就业典礼”。 从事IT行业那么多年,我自己也经历过,也见过很多求职路上的人生百态。 当初我也是从一个不知名的“打工人”,到如今成为了鹅厂的一员… 这其中经历了太多太多&…

又一AIGC独角兽!帮企业定制大模型,营销物料生成发布全包,Adobe前CTO创办

衡宇 发自 凹非寺量子位 | 公众号 QbitAI 全球范围内的投资者纷纷重金押注AI初创公司这事儿,已经越来越掩藏不住了! ——又一家AI初创公司刚刚长成独角兽,这距离其第一次公开露面只过去4个月时间。 最新消息,Adobe前CTO Abhay Par…

“意识机器”初探:如何让大语言模型具备自我意识?

导语 什么是意识?现在的大语言模型具备意识了吗?我们能否造出具备自我意识的机器?在集智俱乐部「后ChatGPT」读书会,北京师范大学系统科学学院教授、集智俱乐部创始人张江老师回顾了意识科学和意识建模领域的进展,认为…

【人工智能AI2.0】清华发布了 ChatGLM-6B 中国大模型5支学术界团队和10大产业界力量介绍

ChatGLM 简介 https://chatglm.cn/login 目录 ChatGLM 简介 ChatGLM 特点 ChatGLM 基于智谱 AI GLM-130B

从脑科学角度解析GPT4及人工智能

来源:图灵教育 本文内容整理自图灵社区直播《对谈 | 刘江 刘嘉:从脑科学 人工智能角度讲透 GPT-4》 刘嘉,清华大学基础科学讲席教授,清华大学心理学系系主任,清华大学脑与智能实验室首席研究员 未来是什么样子&#…

缠论指标缠论指标

点击领取:缠论指标 支持平台 01 通达信(电脑手机) 通达信版本简介 02 01 基础版功能: 支持缠论自动分笔,自动线段,显示笔中枢(蓝色),线段中枢(橙色)&am…

tushareAPI获取股票沪深指数

上证指数历史数据采集 ID:503658 代码 # # 导入tushare import tushare as ts # 初始化pro接口 pro ts.pro_api(你自己的TOKEN)# 拉取数据 df pro.index_daily(**{"ts_code": "000001.SH","trade_date": "","st…

同花顺_代码解析_技术指标_P、Q

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 目录 PBX PRICEOSC PSY PSYFS PVT QACD QLCX QLDX PBX 瀑布线 PBX1:(收盘价的M1日移动平均收盘价的M1*2日简单移动平均收盘价的M1*4日简单移动平均)/3 PBX2:(收盘价的M2日移动平均收…

最新和讯网社会责任指数(超详细指标)

1、数据来源:和讯网 2、时间跨度:2011-2020月6日 3、区域范围:全国 4、指标说明: 和讯网社会责任指标由50个细分指标构成,全体数据量巨大。费了好大功夫才将这些数据爬取下来,有需要的朋友千万不要错过…

同花顺_代码解析_技术指标_T、U

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 目录 TBR TRIX TRIXFS TWR UDL UOS TBR 新三价率 新三价率:100*上涨家数/(上涨家数下跌家数) MATBR1:TBR的M1日异同移动平均 MATBR2:TBR的M2日异同移动平均 1.指数仍处于下跌状态&a…

通达信下单接口获取指数成份股的步骤分享

通达信下单接口获取指数成份股的步骤分享: ContextInfo.get_sector() 接口:https://gitee.com/metatradeapi 用法: ContextInfo.get_sector(sector, realtime) 释义: 获取板块成份股,只支持取指数成份股 参数&…

【Python】ChatAnywhere,ChatGPT API实现的简易版copilot,能够在word、wps、office中写文档使用,任意软件内可用

Chat-Anywhere 在任意软件内使用快捷键补全选中文本,word和wps中都可以方便的使用, 特性 在任意软件内使用 编写文档的好助手 演示动图 选中文本作为上下文提示,按下快捷键CtrlAlt\激活补全,开始后将会自动逐字输出补全的内容 word中使用 …

后台处理请求时间过长导致页面超时

项目中有个从页面发起的AJAX请求后台需要处理十分钟以上,这导致页面超时卡死, 为了解决这个问题,经讨论,我们采用后台异步处理,用到了spring的Async,用法很简单。 首先在spring的xml配置文件中添加如下配…

ChatGPT大热,但马斯克等超1000人签署公开信:所有实验室,立即暂停训练比GPT-4更强大的AI

当全社会都在为AI的进化而欢呼雀跃时,多位科技领袖也表达了深切担忧。 据生命未来研究所官网,3月22日,生命未来研究所(Future of Life)向全社会发布了一封《暂停大型人工智能研究》的公开信,呼吁所有人工智…

谷歌大动作:最高优先级项目曝光,下一代AI搜索,剑指ChatGPT!

编|泽南、小舟 源|机器之心 为了应战,「无为而治」多年的谷歌创始人回来抓起了大方向。 岁末年初,科技公司似乎集体进入了反思阶段。过去一个月里,谷歌创始人拉里・佩奇、谢尔盖・布林与公司高管一直在开会&#xff0…

Android 中各种通知(Notification)的使用

文章目录 通知通道(Channel)通知重要性级别创建基本通知大文本样式通知带图标样式通知大图标样式通知响应用户点击添加操作按钮添加直接回复操作进度条通知设置分类设置锁屏下通知可见性通知导航自定义通知自定义通知内容布局完全自定义通知 通知 Badge显…