首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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问题:使用版本号或时间戳。给每个变量的状态值配备一个时间戳或者版本号。
点赞 8
评论 8
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
07-29 14:04
门头沟学院 Java
长信存储一面挂
面试都没通过,我是不会评价的
点赞
评论
收藏
分享
08-01 10:53
门头沟学院 客户端其它
不要怕,大胆向前走
最近有很多牛友来问我关于实习和秋招时间平衡的问题。一方面担心实习会耽误秋招的进展,另一方面担心不实习的话,秋招简历筛选都过不去。其实吧,对于我们大多数人来说,无论是否实习,最终都是为了那个offer,我也理解大家因为网上说的没有实习或实习划水,面试的时候,被面试官看破。可以类比一下四级,之前就业是不会强制要求四级的,现在呢,很多中大厂甚至小厂都要求四级要过,说到底实习也不过是筛选人的一种滤网罢了,我不推荐伪造实习,但是如果你真的认为实习对你来说很重要,那伪造也未尝不可,只要你的目标是朝着让你变得更好的方向前进,那么一切就都没问题。
吐槽集结地!!!
点赞
评论
收藏
分享
08-01 13:47
广东工业大学 财务
合合信息是大厂吗
偶然间在公众号推文上看到了合合信息开始校招了,有人知道这家公司怎么样嘛
投递合合信息等公司10个岗位
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
百度提前批,三面被推迟一周,喜提秋招第一凉
8643
2
...
他拿大厂SSP Offer打牌是什么概念啊?25届双非之光
3272
3
...
虾皮秋招一面
3040
4
...
百度提前批 三面
2341
5
...
小鹏offer
1677
6
...
最强本科✌
1498
7
...
被猿辅导挂了简历,但我想说...
1478
8
...
虾皮一面凉经
1404
9
...
上班一周,工资还没拿,先欠公司两千
1286
10
...
觉得研发高人一等的这辈子有了
1272
创作者周榜
更多
正在热议
更多
#
工作中哪个瞬间让你想离职
#
64268次浏览
573人参与
#
秋招被确诊为……
#
164842次浏览
762人参与
#
中兴秋招
#
206301次浏览
2302人参与
#
和同事相处最忌讳的是__
#
25005次浏览
247人参与
#
计算机专业还有必要去大厂卷吗
#
38540次浏览
183人参与
#
如何快速融入团队?
#
17484次浏览
207人参与
#
找工作如何保持松弛感?
#
91988次浏览
1111人参与
#
虾皮求职进展汇总
#
249955次浏览
1871人参与
#
Offer比较,你最看重什么?
#
194015次浏览
1313人参与
#
26届的你,投了哪些公司?
#
47107次浏览
506人参与
#
你最希望上岸的公司是?
#
135469次浏览
706人参与
#
简历上的经历如何包装
#
30645次浏览
834人参与
#
你遇到最难的面试题目是_
#
16994次浏览
203人参与
#
我对___祛魅了
#
49839次浏览
445人参与
#
投格力的你,拿到offer了吗?
#
87060次浏览
584人参与
#
柠檬微趣工作体验
#
6802次浏览
40人参与
#
你跟室友的关系怎么样?
#
7556次浏览
114人参与
#
通信硬件岗投递时间线
#
18860次浏览
69人参与
#
你最讨厌面试问你什么?
#
28947次浏览
318人参与
#
什么样的背景能拿SSP?
#
39480次浏览
230人参与
#
地平线求职进展汇总
#
52717次浏览
370人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务