AQS

AQS

  • AQS的作用

    1. AQS是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了AQS以后,更多的协作工具类都可以很方便得被写出来
    2. 一句话总结:有了AQS ,构建线程协作类就容易多了。
  • AQS最核心的就是三大部分:

    1. state
    2. 控制线程抢锁和配合的FIFO队列
    3. 期望协作工具类去实现的获取释放等重要方法
  • state:

    1. 这里的state的具体含义,会根据具体实现类的不同而不同,比如在Semaphore里,它表示"剩余的许可证的数量" ,而在CountDownLatch里,它表示"还需要倒数的数量"。
    2. state是volatile修饰的,会被并发地修改,所以所有修改state的方法都需要保证线程安全,比如getState, setState以及compareAndSetState操作来读取和更新这个状态。这些方法都依赖于j.u.c.atomic包的支持。
  • 控制线程抢锁和配合的FIFO队列:

    1. 这个队列用来存放"等待的线程" , AQS就是"排队管理器",当多个线程争用同一把锁时,必须有排队机制将那些没能拿到锁的线程串在一起。当锁释放时,锁管理器就会挑选一个合适的线程来占有这个刚刚释放的锁
    2. AQS会维护一个等待的线程队列,把线程都放到这个队列里
    3. 这是一个双向形式的队列

在这里插入图片描述

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

    1. 这里的获取和释放方法,是利用AQS的协作工具类里最重要的方法,是由协作类自己去实现的,并且含义各不相同
    2. 获取方法
      1. 获取操作会依赖state变量,经常会阻塞(比如获取不到锁的时候)。
      2. 在Semaphore中,获取就是acquire方法,作用是获取一个许可证。
      3. 而在CountDownLatch里面,获取就是await方法,作用是"等待,直到倒数结束"。
    3. 释放方法:
      1. 释放操作不会阻塞。
      2. 在Semaphore中,释放就是release方法,作用是释放一个许可证。
      3. CountDownLatch里面,释放就是countDown方法,作用是"倒数1个数"。
  • AQS在CountDownLatch的总结:

    1. 调用CountDownLatch的await方法时,便会尝试获取"共享锁" ,不过一开始是获取不到该锁的,于是线程被阻塞。
    2. 而“共享锁"可获取到的条件,就是“锁计数器"的值为0。
    3. 而“锁计数器”的初始值为count ,每当一个线程调用该CountDownLatch对象的countDown()方法时,才将"锁计数器"-1。
    4. count个线程调用countDown()之后, "锁计数器"才为0,而前面提到的等待获取共享锁的线程才能继续运行。
  • AQS在Semaphore的应用:

    1. 在Semaphore中, state表示许可证的剩余数量。
    2. 看tryAcquire方法,判断nonfairTryAcquireShared大于等于0的话,代表成功。
    3. 这里会先检查剩余许可证数量够不够这次需要的,用减法来计算,如果直接不够,那就返回负数,表示失败,如果够了,就用自旋加compareAndSetState来改变state状态,直到改变成功就返回正数;或者是期间如果被其他人修改了导致剩余数量不够了,那也返回负数代表获取失败。
  • AQS在ReentrantLock的应用:

    1. 分析释放锁的方法tryRelease
      1. 由于是可重入的,所以state代表重入的次数,每次释放锁,先判断是不是当前持有锁的线程释放的,如果不是就抛异常,如果是的话,重入次数就减一,如果减到了0,就说明完全释放了,于是free就是true ,并且把state设置为0。
    2. 加锁方法
  • AQS用法:

    1. 第一步:写一个类,想好协作的逻辑,实现获取/释放方法。
    2. 第二步:内部写一个Sync类继承 AbstractQueuedSynchronizer。
    3. 第三步:根据是否独占来重写tryAcquire/tryRelease或tryAcquireShared (int acquires)和tryReleaseShared(int releases)等方法,在之前写的获取/释放方法中调用AQS的acquire/release或者Shared方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值