多线程编程之 AQS

4 篇文章 0 订阅
2 篇文章 0 订阅

寄语:一定要走,走到灯火通明。

看源码被AQS搞得有点蒙的小伙伴们快来看这里,本人萌新一枚,,如果你也喜欢技术希望能一起交流!!

一、什么是AQS

    AQS (理解成一种锁!!)属于java 并发工具包里面,全称“AbstractQueuedSynchronizer”(中文:抽象的队列式同步器 ) ,是一个抽象父类, 是其他同步器的一个框架 ,可以使用框架构建其他的一些并发工具,这就是AQS , 是很多java并发 的底层,可以理解为 构成车子 的车骨架。(reentranLoack是基于AQS的。)

他实现的锁 是一种阻塞式的锁,例如synchronize(CAS是一种无锁(无锁就是没有加锁),乐观锁(这里的乐观锁是一种思想,类似设计模式不是真的锁,Reentrantlock的实现,外部类继承Lock,内部类继承AQS))

二、特点

1.state属性:表示资源状态(分锁住的 内容 是 独占式 还是 共享式,由AQS的子类决定 是独占还是共享)。

独占式:(类似于一个人用三台电脑)锁住的资源仅仅被一个线程所使用。

共享式:(三个人用三台电脑) 锁住的资源可以运行多个线程访问。

2.getState和setState 分别是 获取 和设置 资源的状态。

3.comareAndSetState: 乐观锁机( 在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测 ,适用于读多写少) 制设置state状态。为CAS的机制设置state状态,防止很多线程并发修改state 的值。但由于AQS是阻塞式的锁 ,不会因为抢不到锁而不断重试(舔狗才不断重试),而是直接进入等待队列。

4.提供FIFO(先进先出的等待队列)的等待队列,由AQS维护。

5.条件变量实现等待,唤醒机制,并且支持多个条件变量。

子类继承AQS 需要实现下列五个方法:

tryAcquire:获取锁 ,但是只会 尝试一次获取锁,未获得锁则进入阻塞队列,基于park,unpark让线程是否运行。基于comareAndSetState实现

tryRelease:释放锁成功让阻塞队列里面的线程恢复运行

下期更新,实现reentranLoack!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值