Java并发编程-AQS详解及案例实战(上篇)

文章目录

  • AQS概述
      • AQS 的核心概念
      • AQS 的工作原理
      • AQS 的灵活性
      • 使用场景
  • 使用指南
    • 使用示例
  • AQS的本质:为啥叫做异步队列同步器
      • AQS的核心机制
      • “异步队列”的含义
      • “同步器”的含义
      • 总结
  • 加锁失败的时候如何借助AQS异步入队阻塞等待
      • AQS的锁队列
      • 加锁失败时的处理流程
      • 异步入队的机制
      • 总结
  • ReentractLock如何设置公平锁策略以及原理
      • 设置公平锁策略
      • 公平锁的运作原理
        • 尝试获取锁
        • 释放锁
      • 性能与公平性的权衡
  • tryLock如何实现加锁等待一段时间过后放弃
      • tryLock的基本用法
      • tryLock的实现原理
      • 实现示例
      • 总结
  • ReentractLock底层如何实现
      • ReentrantLock的实现原理
      • ReentrantLock与AQS的关系
  • 用第三个线程尝试加锁失败彻底图解AQS队列等待机制
      • 场景设定
      • Thread C尝试获取锁
      • Thread C加入等待队列
      • Thread C被阻塞
      • 图解
      • 总结
  • AQS默认的非公平加锁策略的运作原理
      • 非公平锁的运作原理
        • 尝试获取锁
        • 重新获取锁
        • 等待队列中的线程
      • 总结
  • 服务注册中心的最近更新服务实例队列实现
      • 设计思路
      • 实现示例
      • 注意事项
  • 服务注册中心提供全量和增量拉取注册表的接口
      • 全量拉取
        • 实现思路:
        • 示例代码(使用Spring Boot):
      • 增量拉取
        • 实现思路:
        • 示例代码(使用Spring Boot):
      • 注意事项
  • 客户端实现启动时拉取全量注册表
      • 步骤 1: 添加依赖
      • 步骤 2: 创建配置类
      • 步骤 3: 实现全量拉取逻辑
      • 步骤 4: 在启动时执行全量拉取
      • 注意事项
  • 案例实战:客户端实现定时拉取增量注册表到本地合并
      • 业务需求
      • 使用AQS设计定时任务
      • 实现步骤
      • 代码示例
      • 注意事项
  • 案例实战:增量合并注册表后进行校验与全量纠正
      • 业务需求
      • AQS辅助设计
      • 实现步骤
      • 代码示例
      • 注意事项
  • AQS如何基于无锁化的CAS机制实现高性能的加锁
      • CAS机制
      • AQS中的CAS应用
        • 获取锁
        • 释放锁
      • 无锁化的优势
  • 如何巧妙的借助AQS中的state变量实现可重入式加锁
      • 可重入锁的基本原理
      • 利用AQS实现可重入锁
      • 示例代码
  • 基于AQS实现的可重入锁释放过程的源码剖析
      • AQS中的锁释放逻辑
      • ReentrantLock的`unlock`方法
      • AQS的`release`方法
      • AQS的`tryRelease`方法
      • 唤醒等待线程
      • 总结
  • 锁释放过后如何对AQS队列中唤醒阻塞线程尝试抢占锁
      • AQS的唤醒机制
      • 唤醒等待线程
      • `unparkSuccessor`方法详解
      • 尝试抢占锁
      • 总结
  • 一种新奇的加锁玩法:读锁和写锁分开是怎么玩的
      • 读写锁的原理
      • 使用场景
      • Java中的读写锁实现
      • 总结
  • 读写锁中的写锁是如何基于AQS的state变量完成加锁的
      • AQS的`state`变量
      • 写锁加锁过程
      • 代码示例
      • 总结
  • 基于AQS的state二进制高低16位判断实现写锁的可重入加锁
      • `state`变量的位分配
      • 写锁的可重入加锁
      • 代码实现
      • 总结
  • 写锁加锁失败时如何基于AQS队列完成入队阻塞等待?
      • 尝试获取写锁
      • 加锁失败后的处理
      • 加入AQS队列
      • 阻塞线程
      • 监听锁状态变化
      • 队列中的线程唤醒
      • 总结
  • 读写锁互斥:基于AQS的state二进制高低16位完成互斥判断
      • `state`变量的位分配
      • 互斥判断
      • 代码示例
      • 互斥性的保证
      • 总结

AQS概述

AQS,全称 AbstractQueuedSynchronizer,是 Java 并发包 java.util.concurrent.locks 中的一个抽象类,它为实现依赖于先进先出(FIFO)等待队列的阻塞锁和其他同步器提供了基础框架。AQS 是 Java 内置锁和大部分并发工具类(如 ReentrantLock, Semaphore, CountDownLatch 等)的基础,通过它我们可以理解 Java 高级并发工具的内部工作原理。

提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。此类被设计为大多数类型的同步器的有用基础,这些同步器依赖于单个原子int值来表示状态。子类必须定义更改该状态的受保护方法,以及定义该状态在获取或释放该对象方面的含义。给定这些,类中的其他方法执行所有排队和阻塞机制。子类可以维护其他状态字段,但只跟踪使用方法getState、setState和compareAndSetState操作的原子更新的int值。
子类应定义为非公共内部帮助类,用于实现其封闭类的同步属性。类AbstractQueuedSynchronizer不实现任何同步接口。相反,它定义了诸如Acquisible Interruptible之类的方法,具体锁和相关同步器可以适当地调用这些方法来实现它

你可能感兴趣的:(Java技术栈源码分析,java,AQS,并发编程,原理)