AQS详解

1. AQS概念

Jdk的并发包提供了各种锁及同步机制,其实现的核心类是AbstractQueuedSynchronizer,我们简称为AQS框架,它为不同场景提供了实现锁及同步机制的基本框架,为同步状态的原子性管理、线程的阻塞、线程的解除阻塞及排队管理提供了一种通用的机制。

AQS是为实现依赖于 先进先出 (FIFO) 等待队列  的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架。它使用了一个原子的int value status来作为同步器的状态值(如:独占锁。1代表已占有,0代表未占有),通过该类提供的原子修改status方法(getState, setState and compareAndSetState),我们可以把它作为同步器的基础框架类来实现各种同步器。  AQS还定义了一个实现了Condition接口的ConditionObject内部类。Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。 

简单来说,就是Condition提供类似于Object的wait、notify的功能signal和await,都是可以使一个正在执行的线程挂起(推迟执行),直到被其他线程唤醒。但是Condition更加强大,如支持多个条件谓词、保证线程唤醒的顺序和在挂起时不需要拥有锁。

2. CLH队列(FIFO)

这是一个双向链表,每个节点里面都有一个prevnext,它们分别是前一个节点和后一个节点的引用


3. 自定义同步器

isHeldExclusively () :该线程是否正在独占资源
tryAcquire ( int ) :独占方式。尝试获取资源,成功则返回 true ,失败则返回 false
tryRelease ( int ) :独占方式。尝试释放资源,成功则返回 true ,失败则返回 false
tryAcquireShared ( int ) :共享方式。尝试获取资源。负数表示失败; 0 表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源
tryReleaseShared ( int ) :共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点 返回 true ,否则返回 false

4. 源码详解


tryAcquire():尝试直接去获取资源,如果成功则直接返回

acquireQueued():使线程在等待队列中获取资源,一直获取到资源后才返回。如果在整个等待过程中被中断过,则返回true,否则返回false。

addWaiter():将该线程假如等待队列的尾部,并标记为独占模式。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值