JAVA AQS的作用 内部原理解析

AQS是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了AQS,更多的协作工具类都可以很方便得写出来。有了AQS,构建线程协作类就容易多了。

AQS最核心的就是三个部分:

一:.state:

1.这里的state的具体含义,会根据具体实现类的不同而不同,比如在Semaphore里,它表示“剩余的许可证数量”,而在CountDownLatch中,它表示“还需要倒数的数量”,在ReentrantLock中,state表示锁的占有情况,包括可重入计数,当state为0的时候,表示Lock不被任何线程所占有

2.state是volatile修饰的,会被并发的修改,所以所有修改state的方法都需要保证线程安全,比如getState、setState以及compareAndSetState操作来读取和更新这个状态。这些方法都依赖于juc.atomic包的支持

二:控制线程抢锁和配合FIFO队列

1.这个队列用来存放“等待的线程”,AQS就是“排队管理器”,当多个线程争用同一把锁时,必须有排队机制将那些没有拿到锁的线程串在一起。当锁释放时,锁管理器就会挑一个合适的线程来占有这个刚刚释放的锁

2.AQS会维护一个等待的线程队列,把线程都放到这个队列里,并且这队列是双向链表的形式

三:期望协助工具类去实现的获取/释放等重要方法

1.这里的获取和释放方法,是利用AQS的协作工具类里最重要的方法,是由协作类自己去实现的吗,并且含义各不相同

1.2.获取方法:获取操作会依赖state变量,经常会阻塞(比如获取不到锁的时候)

1.3.在Semaphore中,获取就是acquire方法,作用是获取一个许可证(state减一是正数就可以获取到,是0就获取不到)

1.4.在CountDownLatch里面,获取就是await方法,作用是等待,直到倒数结束(state不等于0就处理阻塞状态,等于0就获取到了)

1.5.释放不会阻塞

1.6 在Semaphore中,释放就是release方法,作用是释放一个许可证

1.7 在CountDownLathc中,释放就是countDown方法,作用是倒数一个数

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

softwareDragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值