概念
持锁模式-资源占用模式:
你是想要群体面试,还是单独面试啊
独占和共享
获锁方式:
是不是要把手机关机啊,赶不赶时间是不是必须要在某个时间内面试完,是否公平啊
不响应线程中断;响应线程中断;定时获取锁;公平获取;非公平获取
同步状态-锁状态;
操作系统,互斥锁,信号量
Boolean、int
同步队列、条件队列:
别人在面试时你是不是需要等待啊。还没有准备好是不是需要准备好了再面试啊
通过引用构成队列;某些条件没有满足而进入条件队列,某些条件满足了而唤醒某个条件队列中的线程
等待状态:
等待面试的过程中,避免自己睡过头了,叫前一个人面试完了叫一下我
等待状态自己别人都可以修改:waitStatus=0(默认),CANCELLED,SIGNAL,CONDITION,PROPAGATE
定时获取锁的分类:
绝对时间-截止时间
相对时间-自旋,焦急的等待,自旋时间是一个门限值,为了快速响应;超时时间>自旋时间,就将线程挂起一段时间;超时时间<=自旋时间,继续在while循环中执行
相对时间-不自旋
AQS独占模式/不响应线程中断获取锁-流程
AQS我与资源/外界与我
- 一来就尝试获取锁
- 获取锁失败,说自己要一个单间就去同步队列中排队
- 进入同步队列之后还是先尝试获取锁
- 获取锁失败,是不是应该将自己挂起,挂起之前避免自己睡过头了,修改前面结点的等待状态,叫他回来的时候叫醒我
- 睡觉去了
- 醒来之后判断有没有过中断,有中断也只是记录下来
- 作为头结点尝试获取锁成功之后
- 进入房间办事
- 办完事情准备出门,尝试释放锁并叫醒下一个人
- 出门之后,有过中断则自己中断自己
AQS共享模式/不响应线程中断获取锁-流程
获取锁
锁状态>0:将自己设置为head结点,并唤醒直接后继是共享模式的结点,提示将来的后继结点
锁状态=0:当前结点获取锁成功,但后继结点不能再获取了
锁状态<0:当前结点获取锁失败文章来源:https://www.toymoban.com/news/detail-552221.html
- 一来就尝试获取锁
- 获取锁失败(锁状态<0),说自己要一个多人间就去同步队列中排队
- 进入同步队列之后还是先尝试获取锁
- 获取锁失败,是不是应该将自己挂起,挂起之前避免自己睡过头了,修改前面结点的等待状态,叫他回来的时候叫醒我
- 睡觉去了
- 醒来之后判断有没有过中断,有中断也只是记录下来
- 作为头结点尝试获取锁成功之后,唤醒直接后继是共享模式的结点,提示将来的后继结点
- 进入房间办事
- 办完事情准备出门,尝试释放锁并叫醒下一个人,如果没有人也会设置等待状态为PROPAGATE
AQS独占模式和共享模式对比
获取锁:
独占模式:tryAcquire();返回boolean类型的值
共享模式:tryAcquireShared(arg);返回int类型锁状态<0,=0,>0;并根据锁状态有不同的后续操作
释放锁:
独占模式:tryRelease();尝试释放锁并叫醒下一个人
共享模式:tryReleaseShared(arg);尝试释放锁并叫醒下一个人,如果没有人也会设置等待状态为PROPAGATE文章来源地址https://www.toymoban.com/news/detail-552221.html
到了这里,关于Java多线程/AQS源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!