首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
海星98
西安电子科技大学 后端
发布于北京
关注
已关注
取消关注
@悟空WK:
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问题:使用版本号或时间戳。给每个变量的状态值配备一个时间戳或者版本号。
点赞 9
评论 8
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
08-08 18:28
基恩士_销售工程师(准入职员工)
基恩士内推
不知不觉就来鸡舍3个月了 说点我个人的感受 每周频繁的外出 我是蛮喜欢外出的 有免费的专车自由度还高 要是远地外出还有免费的酒店 工作强度我觉得正常 横向对比 固定双休真香啊 组织氛围很好 老板们都很年轻 很好沟通 唯一的不足就是 我感觉自己的工作能力还远远不够 下班后又不想花额外时间学习 只能说希望时间让我快快成长吧 反正我感觉还能再干三年‼基恩士2026届秋招启动【公司介绍】1974年成立于日本大阪,1987年于日本上市,2001年进入中国。主营传感器、测量仪器、数码显微系统、激光刻印机、影像系统、PLC、条码读取器等工业自动化产品。日本上市企业市值TOP5。【招聘岗位】销售工程师/销售。...
基恩士公司福利 404人发布
点赞
评论
收藏
分享
08-14 12:03
门头沟学院 硬件开发
雷总,像我这样钱少活多的员工可不好找啊
你真的不要吗
点赞
评论
收藏
分享
07-26 18:18
郑州轻工业大学 嵌入式软件开发
简历求拷打,投了快一百个了,邀请我面试的只有三个,问题出在哪
简历求拷打,投了快一百个了,邀请我面试的只有三个,问题出在哪😭
我的简历长这样
点赞
评论
收藏
分享
07-26 07:41
第一拖拉机制造厂拖拉机学院 C++
互联网大厂
大厂都在这了 超一线大厂都不太卡 美团和快手也不是特别卡 剩下的交给牛友锐评了
风评不好的公司,你会去吗...
点赞
评论
收藏
分享
08-13 12:19
门头沟学院 运营
小米秋招
流程终于是推进了,笔试过了一周,总算到简历评估了
投递小米集团等公司10个岗位
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
【评论得现金💰】牛客评论活动又来咯
7.7W
2
...
8月份面经整理的算法高频题集合
9974
3
...
饿了么笔试题解 8月15日
8557
4
...
美团二笔还没发邮件
7141
5
...
大疆结构秋招一面
5877
6
...
8.13快手秋招Java后端二面记录
4114
7
...
家里人一直跟我说要给领导买点东西,搞好关系
4063
8
...
快手秋招-后端一面
4056
9
...
快手 秋招 一面
3484
10
...
饿了么笔试
3339
创作者周榜
更多
正在热议
更多
#
给26届的秋招建议
#
31918次浏览
861人参与
#
应届生初入职场,求建议
#
239518次浏览
2698人参与
#
实习的内耗时刻
#
48326次浏览
558人参与
#
发工资后,你做的第一件事是什么
#
71854次浏览
242人参与
#
工作上你捅过哪些篓子?
#
18913次浏览
125人参与
#
在职场上,你最讨厌什么样的同事
#
27436次浏览
196人参与
#
秋招投递记录
#
27019次浏览
304人参与
#
我的秋招“寄”录
#
38947次浏览
505人参与
#
秋招,不懂就问
#
10745次浏览
115人参与
#
你最近一次加班是什么时候?
#
79643次浏览
424人参与
#
网易求职进展汇总
#
112856次浏览
1066人参与
#
查收我的offer竞争力报告
#
195645次浏览
1291人参与
#
我的国央企投递进展
#
51857次浏览
312人参与
#
我的AI电子员工
#
12897次浏览
104人参与
#
如果校招重来我最想改变的是
#
278510次浏览
2898人参与
#
独居后,你的生活是更好了还是更差了?
#
12443次浏览
168人参与
#
安克创新求职进展汇总
#
40033次浏览
440人参与
#
你上一次给父母打电话是什么时候
#
12040次浏览
115人参与
#
规定下班时间vs实际下班时间
#
19965次浏览
154人参与
#
运营每日一题
#
90507次浏览
798人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务