首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
滴滴
校招火热招聘中
官网直投
相关推荐
饥饿的马里奥被升职
05-09 10:54
吉林大学 电子信息类
求内推
现在还有什么央国企可以投啊
点赞
评论
收藏
转发
sorano_
05-09 21:48
门头沟学院 计算机类
拼多多5.9笔试3.88/4,但是cpp,有希望进面吗
所有流程都在泡池子,希望这段时间有个面试来转移注意力pdd是笔试完再发测评再约面的吗?cpp选手是不是压根进不了面或者进面就是送的
投递拼多多等公司10个岗位 >
点赞
评论
收藏
转发
我是天子
03-16 15:11
马鞍山学院 计算机类
笑嘻了,黑马的付费实习
知道实习难找我就自己开一个实习班,到时候人手一段实习
点赞
评论
收藏
转发
在创作的杰克很爱吃香菜
03-25 22:50
华南理工大学 数学类
家人们求求给简历提建议 不玻璃心🥹
感觉自己项目经历写太多了 想问问留哪个比较好
点赞
评论
收藏
转发
在吃瓜的青提很用心
昨天 11:05
博世_视觉算法工程师(准入职员工)
博世暑期实习内推
大家好!全球100强企业——博世中国暑期实习开始啦!25届也可以用这个内推码,大家可以收藏一下。注意岗位特点:专业不限岗位注意多介绍自己个人经验合综合素质,多围绕实习和岗位工作内容来展开,岗位写的xx专业优先建议把项目和大赛经验发在重点介绍 。关键词:外企 大厂 WLB你是否渴望工作生活平衡的工作,你是否想加入跨国公司与全球各地的伙伴一起协作,你是否想加入一家百年企业感受永不上市的文化。这里就是博世!欢迎你的加入!作为校招加入博世的应届生,当时最打动我的还是招聘者的一句话:确实,入职以来,听到最多的是“合规”,创始人罗伯特·博世的“宁失利,勿失信”令我印象深刻。作为全球汽车供应商的龙头老大...
投递博世等公司7个岗位 >
点赞
评论
收藏
转发
点赞
收藏
评论
分享
回复帖子
全站热榜
1
...
携程oc了
3.2W
2
...
美团-Java后端-平台技术部-一面凉经(复活赛)
1.3W
3
...
我真是一个废物,废物本废,到现在也找不到实习不管回答上来,还是没回答上来,都不会有公司要我的。。。。。。。情绪每天都在边缘游走,快抑郁了好了,emo完了,继续努力,总有眼瞎面试官能看上我的叭
9679
4
...
31天勇闯盲审(附盲审经验
7370
5
...
微信支付二面
6980
6
...
捞简历这件事儿
6428
7
...
科大讯飞Java实习凉经
6152
8
...
【话术建议】求职者和企业的互骗话术?
5568
9
...
字节抖音电商后端日常实习一二三面已oc
5004
10
...
问一下xdm 怎么把拒绝过的Offer 再舔回来🥺
4744
正在热议
#
牛客帮帮团来啦!有问必答
#
677097次浏览
11193人参与
#
Offer比较,你最看重什么?
#
49015次浏览
478人参与
#
你会选择考研还是直接就业
#
74167次浏览
850人参与
#
市场营销面经
#
3764次浏览
111人参与
#
我的上岸简历长这样
#
159195次浏览
3166人参与
#
浅聊一下我实习的辛苦费
#
79476次浏览
735人参与
#
无实习如何秋招上岸
#
217548次浏览
3403人参与
#
投了多少份简历才上岸
#
55308次浏览
932人参与
#
运营面经
#
10142次浏览
259人参与
#
2022届毕业生现状
#
314566次浏览
4390人参与
#
毕业后不工作的日子里我在做什么
#
51538次浏览
684人参与
#
租房前辈的忠告
#
32362次浏览
2061人参与
#
你的简历改到第几版了
#
297908次浏览
4500人参与
#
硬件人的简历怎么写
#
76980次浏览
779人参与
#
你已经投递多少份简历了
#
288589次浏览
4365人参与
#
华为开奖那些事
#
697764次浏览
5982人参与
#
简历中的项目经历要怎么写
#
424983次浏览
7252人参与
#
我的成功项目解析
#
80640次浏览
2356人参与
#
通信硬件人笔面经互助
#
103128次浏览
2116人参与
#
秋招开了,你想投哪些公司呢
#
115789次浏览
3236人参与
牛客网
牛客企业服务