首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
课程
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
在线笔面试、雇主品牌宣传
登录
/
注册
海星98
西安电子科技大学 计算机类
发布于北京
关注
已关注
取消关注
@悟空GGG:
Java后端高频面试问题:AQS和CAS
精华
1.AQS AQS:抽象同步队列AbstractQueuedSynchronizer AQS是一个FIFO的双向队列,队列元素的类型为Node。AQS里面包括Node节点、state变量、ConditionObject内部类(条件变量) 一个锁对应一个AQS阻塞队列,对应多个条件变量,每个条件变量有自己的一个条件队列。 ①Node节点 Node节点中的thread变量用来存放进入AQS队列里面的线程 shared变量用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的 exclusive变量用来标记线程是获取独占资源时被挂起后放入AQS队列的 waitStatus变量记录当前线程的等待状态,waitStatus可以为cancelled(线程被取消了)、signal(线程需要被唤醒)、condition(线程在条件队列里面等待)、propagate(释放共享资源时需要通知其他节点) ②ConditionObject类 ConditionObject用来结合锁实现线程同步的。 ConditionObject是条件变量,每个条件变量对应一个条件队列(单向链表队列),其用来存放调用条件变量的await()方法后被阻塞的线程。 1.当一个获得锁的线程调用await()方法时(必须先调用锁的lock()方法获取锁),在内部会构造一个类型为Node.CONDITION的node节点,然后将该节点插入 条件队列末尾,之后当前线程会释放获取的锁(修改锁对应的state变量的值),并被阻塞挂起。 2.当另外一个线程调用ConditionObject条件变量的signal方法时(必须先调用锁的lock()方法获取锁),在内部会把条件队列里面队头的一个线程节点从条件队 列里面移除并放入AQS的阻塞队列里面,然后激活这个线程。 ③state变量 private volatile int state; //共享变量,使⽤volatile修饰保证线程可⻅性 线程同步的关键是对状态值state进行操作,根据state是否属于一个线程,操作state的方式分为独占方式和共享方式。 1.在独占方式下,获取锁与释放锁的流程如下 当一个线程调用acquire()方法获取独占资源时,会首先使用tryAcquire()方法尝试获取资源,具体是设置状态变量state的值,成功则直接返回,失败则将当前线 程封装为Node.EXCLUSIVE的Node节点后插入到AQS的阻塞队列的尾部,并调用LockSupport.park(this)方法挂起自己。 当一个线程调用release()方法时会尝试使用tryRelease()操作释放资源,这里是设置状态变量state的值,然后调用LockSupport.unpark(thread)方法激活AQS队 列里面被阻塞的一个线程(thread)。被激活的线程则使用tryAcquire()尝试,看当前状态变量state的值是否能满足自己的需要,满足则该线程被激活,然后继续 向下运行,否则还是会被放入AQS队列并挂起。 2.在共享方式下,获取与释放资源的流程如下 当一个线程调用acquireShared()方法获取共享资源时,会首先使用tryAcquireShared()方法尝试获取资源,具体是设置状态变量state的值,成功则直接返回, 失败则将当前线程封装为Node.SHARED的Node节点后插入到AQS的阻塞队列的尾部,并调用LockSupport.park(this)方法挂起自己。 当一个线程调用releaseShared()方法时会尝试使用tryReleaseShared()操作释放资源,这里是设置状态变量state的值,然后调用LockSupport.unpark(thread)方法激活AQS队列里面被阻塞的一个线程(thread)。被激活的线程则使用tryAcquireShared()尝试获取资源,具体是查看当前状态变量state的值是否能满足自己的 需要,满足则该线程被激活,然后继续向下运行,否则还是会被放入AQS队列并挂起。 ②CAS CAS:CompareAndSwap (比较并替换) CAS算法的过程是:它包含3个参数CAS(V,E,N),其中V表示要更新的变量,E表示预期值,N表示新值。 仅当V值等于E值时,才会将V的值设置为N,如果V值和E值不同,说明已经有其他线程做了更新,则当前线程什么都不做。最后CAS返回当前V的真实值。 在多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并允许再次尝试,当然也允许失败的线程放弃操作。 CAS怎么保证修改的值可见?volatile关键字 volatile 关键字的主要作⽤就是保证变量的可⻅性然后还有⼀个作⽤是防⽌指令重排序。 当修改volatile变量时,JMM会把线程对应的工作内存中的共享变量值刷新到主内存中。 当读取volatile变量时,JMM会把该线程对应的工作内存置为无效,线程从主内存中读取共享变量值。 ABA问题:在CAS操作中有个经典的ABA问题?解决方式?(版本号、时间戳) 假如线程①使用CAS修改初始值为A的变量X,那么线程①会首先去获取当前变量X的值(为A),然后使用CAS操作尝试修改X的值为B,如果使用CAS操作成功了,程序运行也不一定是正确的。 在线程①获取变量X的值A后,在执行CAS前,线程②使用CAS修改了X的值为B,然后又使用CAS修改了变量X的值为A。 所以,线程①执行CAS时X的值是A,但是这个A已经不是线程①获取时的A了,这就是ABA问题。 ABA问题的产生是因为变量的状态值产生了环形转换。 避免ABA问题:使用版本号或时间戳。给每个变量的状态值配备一个时间戳或者版本号。
点赞 8
评论 8
全部评论
推荐
最新
楼层
秋招专场
校招火热招聘中
官网直投
相关推荐
程序员小白条
06-07 22:37
门头沟学院 计算机类
全知科技一面 Java开发实习面经
全知科技一面 Java 开发实习面经 刚开始忘记录音了,后续补上了,总体来说各方面都有涉及,可能计网和操作系统这块没有涉及,然后就是没算法题。面试体验还可以,没啥压力~ 1)简单的自我介绍 2)介绍下实习做的事情 3)介绍简历项目和开源项目 4)爬虫怎么使用的? 5)动态爬虫和静态爬虫?Selenium? 6)流量染色怎么实现的?有什么用?为什么做? 7)有没有对项目高并发环境做过预处理 8)限流算法 9)Redis 基本数据类型和底层数据结构,以及应用场景介绍 10)Redis 的持久化策略,RDB 和 AOF 各自的优缺点和使用场景 11)Redis 宕机数据恢复过程 12)Redis 和...
查看21道真题和解析
软件开发笔面经
点赞
评论
收藏
分享
牛客212003206号
06-05 19:04
四川大学 计算机类
华为软件开发实习笔试面试经过
现在的状态是两轮面试已通过,综合测评需要重测。在这想请问一下各位大佬,给我内推的人表示我的流程在部门里是比较快走完的,是否代表最后拿到offer的概率会比较大呢?笔试考了三道题,100+100+200,第一题是lru缓存,数据范围很小我就直接暴力写了。第二题很难,即使是暴力也很难写,就没管(当时已经没想到笔试能过了)。第三题暴搜能拿一大半分,正解同样不会。所以真没想到笔试能过,还是华为这种大厂。。面试第一轮,围绕着简历上写的东西问了很多技术细节问题,都比较简单(队列,二叉树之类的)。手撕代码是字符串,很简单。第二轮就直接是主管面了,同样全程围绕简历项目,技术细节少一些,抽象的逻辑和实现方面多一...
查看3道真题和解析
软件开发2024笔面经
点赞
评论
收藏
分享
CSDN逐梦苍穹
05-26 20:43
广东技术师范大学 计算机类
这简历能找到暑假Java实习么
这简历能找到暑假实习吗? #Java实习#
点赞
评论
收藏
分享
thefy
06-04 17:22
已编辑
电子科技大学 计算机类
双9狂挂简历,主打一个听劝
需要去硬造个项目吗,没有面试机会很难顶。三月末开始投,除了美团都没给面试。—-现在改成这样了——准备等到五月中旬,希望能等到面试5.15更 到点了 到现在只有5.14一个京东的后端面试,面试官不懂go,只懂Java。问的问题都很泛,让人不知道怎么回答。而且全程感觉没听人讲话,刚讲的事情过一会又问。面完秒挂。阿里国际面试整体还不错,但最后还是问到java,我不太会。提前准备秋招了,后端暑期实习应该是结束了。可能当时卷卷java还有点机会,可能走错路了。6/4 更收到安恒信息成都offer了五月底有个字节国际电商一面 被干碎今天收到快手和网易互娱面试邀请了。感觉捡漏的机会要来了
投递快手等公司10个岗位
点赞
评论
收藏
分享
小lin在找工作
06-04 18:54
广州商学院 外国语言文学类
这样的我,请问能找到实习工作吗
点赞
评论
收藏
分享
点赞
收藏
评论
分享
回复帖子
提到的真题
返回内容
全站热榜
1
...
计算机去央国企(银行软开篇)
2.5W
2
...
24届985计算机废物春招感想(央国企、银行)
1.8W
3
...
秋招在即,求刷题搭子!!
1.3W
4
...
问一下大家的实习薪资是多少?
7514
5
...
有个好导师真幸福
5085
6
...
导师不放实习,实习偷跑一个月经历
4078
7
...
美团 实习
3966
8
...
颇有感慨
3780
9
...
小公司要求真高
3362
10
...
【💰有奖征集】软件开发笔面经邀你来分享!🙋♂️
3129
正在热议
#
和牛牛一起刷题打卡
#
26909次浏览
2087人参与
#
24届软开秋招面试经验大赏
#
1193791次浏览
18303人参与
#
不去互联网可以去金融科技
#
33782次浏览
409人参与
#
牛客帮帮团来啦!有问必答
#
1209023次浏览
17663人参与
#
我在牛爱网找对象
#
57590次浏览
431人参与
#
你觉得通信/硬件有必要实习吗?
#
27258次浏览
468人参与
#
OPPO开奖
#
36433次浏览
531人参与
#
软件开发笔面经
#
7228次浏览
251人参与
#
研究所VS国企,该如何选
#
49951次浏览
565人参与
#
如何拒绝/反向PUA
#
21581次浏览
188人参与
#
公司情报交流地
#
13575次浏览
82人参与
#
听劝,我这个简历该怎么改?
#
64579次浏览
651人参与
#
在国企工作的人,躺平了吗?
#
116986次浏览
1640人参与
#
提前批的机械人,你们都有面试了吗
#
14310次浏览
210人参与
#
0offer是寒冬太冷还是我太菜
#
461922次浏览
5168人参与
#
京东方求职进展汇总
#
7796次浏览
73人参与
#
产运销实习日记
#
3322次浏览
112人参与
#
想实习转正,又想准备秋招,我该怎么办
#
159584次浏览
1811人参与
#
晒晒我司的端午福利
#
2884次浏览
56人参与
#
我的失利项目复盘
#
260515次浏览
5507人参与
#
一人推荐一个值得去的通信/硬件公司
#
66611次浏览
885人参与
#
机械只有转码才有出路吗?
#
5385次浏览
125人参与
牛客网
牛客企业服务