Java并发——AQS

本文深入探讨了AQS(AbstractQueuedSynchronizer)在Java并发编程中的关键角色,揭示了AQS如何通过CAS操作管理同步状态,以及它是如何支持如ReentrantLock等高级同步组件的。文章详细解释了AQS的内部结构,包括双向链表和volatile修饰的state变量,阐述了线程如何通过CAS尝试获取锁,以及失败后进入等待队列的流程。
摘要由CSDN通过智能技术生成

1、Lock与AQS与CAS的关系

Lock面向用户,AQS面向Lock,也就是说AQS为各种Lock提供了底层的支持,AQS的最核心原理之一就是利用CAS更新同步状态。

2、AQS介绍

AQS是AbustactQueuedSynchronizer的简称,它是一个Java提供的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同步组件的内部类。

3、AQS实现原理

先看看AQS的内部结构:
在这里插入图片描述

  • 双向链表:用于存储请求同步变量(锁)的线程,当前持有锁的线程处于head,新进来的无法获取到锁的线程则被包装成为一个Node节点依次放于队尾。
  • state:这是AQS里面最重要的一个变量,锁的获取与释放都与其密切相关。当它等于0时,表示没有线程持有锁,当大于0(锁可重入,每次获取锁,state加1)时表示有线程持有锁。其用volatile关键字声明,这样保证了其可见性,并结合CAS实现了同步。

用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值