并发编程(七):AQS框架(实现锁机制的AQS框架你了解多少)

本文详细介绍了AQS(AbstractQueuedSynchronizer),一个用于构建锁和同步器的Java框架。AQS通过一个双向链表管理线程的等待队列,支持公平锁和非公平锁,以及可重入特性。文章分析了AQS的基本原理,包括线程的等待模式、状态管理以及如何通过模板方法模式实现自定义同步器。此外,还讨论了AQS在ReentrantLock、Semaphore和CountDownLatch等组件中的应用。
摘要由CSDN通过智能技术生成

AQS(一种实现锁机制的框架,也可以说一些基类组合构建锁和同步器)

 

一:基本概念

AQS框架:全称AbstractQueuedSynchronizer。(抽象队列同步)

AQS是一个用来构建锁和同步器的(各种基类)框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们自己需求的同步器。

总结:手撕核心类AbstractQueuedSynchronizer,你会对AQS认识更加深刻,然后Count

 

二:AQS基本原理的详细分析

类图分析(下面会详细说明)

 

基本锁的特性:

加锁、解锁

以ReentrantLock为例:

可重入锁,公平锁,非公平锁

可重入锁,公平锁,非公平锁概念自行知乎

上述概念结合源码进行分析(以ReentrantLock为例)

private final Sync sync;
// ReentrantLock的加锁方法
public void lock() {
    sync.lock();
}
//ReentrantLock 释放锁
public void unlock() {
    sync.release(1);
}
// 以下代码是ReentrantLock实现公平锁和非公平锁的构造方法
/**
 * Creates an instance of {@code ReentrantLock}.
 * This is equivalent to using {@code ReentrantLock(false)}.
 * 默认非公平锁
 */
public ReentrantLock() {
    sync = new NonfairSync();
}

/**
 * Creates an instance of {@code ReentrantLock} with the
 * given fairness policy.
 * 公平锁
 * @param fair {@code true} if this lock should use a fair ordering policy
 */
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}

实现公平,非公平的详细过程后续会详细讲到

 

AbstractQueuedSynchronizer核心类

/**
 * Acquires in exclusive mode, ignoring interrupts.  Implemented
 * by invoking at least once {@link #tryAcquire},
 * returning on success.  Otherwise the thread is queued, possibly
 * repeatedly blocking and unblocking, invoking {@link
 * #tryAcquire} until success.  This method can be used
 * to implement method {@link Lock#lock}.
 *
 * @param arg the acquire argument.  This value is conveyed to
 *        {@link #tryAcquire} but is otherwise uninterpreted and
 *        can represent anything you like.
 */
public final void acquire(int arg) {
    if (!tryAcquire(arg) &&
    // 唤醒queue中的线程;addWaiter向队列中添加线程
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值