0
点赞
收藏
分享

微信扫一扫

观察者模式(上):详解各种应用场景下观察者模式的不同实现方式

juneyale 2023-07-13 阅读 84

概念

持锁模式-资源占用模式:
 你是想要群体面试,还是单独面试啊
 独占和共享
获锁方式:
 是不是要把手机关机啊,赶不赶时间是不是必须要在某个时间内面试完,是否公平啊
 不响应线程中断;响应线程中断;定时获取锁;公平获取;非公平获取
同步状态-锁状态;
 操作系统,互斥锁,信号量
 Boolean、int
同步队列、条件队列:
 别人在面试时你是不是需要等待啊。还没有准备好是不是需要准备好了再面试啊
 通过引用构成队列;某些条件没有满足而进入条件队列,某些条件满足了而唤醒某个条件队列中的线程
等待状态:
 等待面试的过程中,避免自己睡过头了,叫前一个人面试完了叫一下我
 等待状态自己别人都可以修改:waitStatus=0(默认),CANCELLED,SIGNAL,CONDITION,PROPAGATE

定时获取锁的分类:
 绝对时间-截止时间
 相对时间-自旋,焦急的等待,自旋时间是一个门限值,为了快速响应;超时时间>自旋时间,就将线程挂起一段时间;超时时间<=自旋时间,继续在while循环中执行
 相对时间-不自旋

AQS独占模式/不响应线程中断获取锁-流程

AQS我与资源/外界与我

  1. 一来就尝试获取锁
  2. 获取锁失败,说自己要一个单间就去同步队列中排队
  3. 进入同步队列之后还是先尝试获取锁
  4. 获取锁失败,是不是应该将自己挂起,挂起之前避免自己睡过头了,修改前面结点的等待状态,叫他回来的时候叫醒我
  5. 睡觉去了
  6. 醒来之后判断有没有过中断,有中断也只是记录下来
  7. 作为头结点尝试获取锁成功之后
  8. 进入房间办事
  9. 办完事情准备出门,尝试释放锁并叫醒下一个人
  10. 出门之后,有过中断则自己中断自己

AQS共享模式/不响应线程中断获取锁-流程

获取锁
 锁状态>0:将自己设置为head结点,并唤醒直接后继是共享模式的结点,提示将来的后继结点
 锁状态=0:当前结点获取锁成功,但后继结点不能再获取了
 锁状态<0:当前结点获取锁失败

  1. 一来就尝试获取锁
  2. 获取锁失败(锁状态<0),说自己要一个多人间就去同步队列中排队
  3. 进入同步队列之后还是先尝试获取锁
  4. 获取锁失败,是不是应该将自己挂起,挂起之前避免自己睡过头了,修改前面结点的等待状态,叫他回来的时候叫醒我
  5. 睡觉去了
  6. 醒来之后判断有没有过中断,有中断也只是记录下来
  7. 作为头结点尝试获取锁成功之后,唤醒直接后继是共享模式的结点,提示将来的后继结点
  8. 进入房间办事
  9. 办完事情准备出门,尝试释放锁并叫醒下一个人,如果没有人也会设置等待状态为PROPAGATE

AQS独占模式和共享模式对比

获取锁:
 独占模式:tryAcquire();返回boolean类型的值
 共享模式:tryAcquireShared(arg);返回int类型锁状态<0,=0,>0;并根据锁状态有不同的后续操作
释放锁:
 独占模式:tryRelease();尝试释放锁并叫醒下一个人
 共享模式:tryReleaseShared(arg);尝试释放锁并叫醒下一个人,如果没有人也会设置等待状态为PROPAGATE

举报

相关推荐

0 条评论