JAVA并发之谈谈你对AQS的理解
创始人
2024-02-18 09:22:02
0

文章目录

  • 一、AQS是什么
  • 二、AQS具备哪些特性
  • 三、用的哪种设计模式
  • 四、AQS与锁二者之间的关系
  • 五、如何基于AQS实现一把独占锁
  • 六、参考资料

一、AQS是什么

AQS的全称是 (AbstractQueuedSynchronizer ),它定义了一套多线程访问共享资源的同步器框架,是 J.U.C 包中多个组件的底层实现,如 Lock、CountDownLatch、Semaphore 等都用到了 AQS。

通过查看AbstractQueuedSynchronizer的实现类如下图:
aqs

二、AQS具备哪些特性

  1. 阻塞等待队列
    1.1 获取锁失败的线程会进入到一个阻塞等待队列中。
  2. 共享 / 独占
    从本质上来说,AQS 提供了两种锁机制,分别是独占锁,和共享锁。
    2.1 独占锁,就是存在多线程竞争同一共享资源时,同一时刻只允许一个线程访问该共享资源,也就是多个线程中只能有一个线程获得锁资源,比如 Lock 中的ReentrantLock 重入锁实现就是用到了 AQS 中的排它锁功能。
    2.2 共享锁也称为读锁,就是在同一时刻允许多个线程同时获得锁资源,比如CountDownLatch 和 Semaphore 都是用到了 AQS 中的共享锁功能。
  3. 公平/非公平
    3.1 公平:线程在获取锁失败时,直接进入阻塞队列。
    3.2 非公平:线程在获取锁失败时,进入阻塞队列总会再尝试一次获取锁,插队
  4. 可重入
    4.1 对于同一把锁,获取锁的当前线程可以重复获取。
  5. 允许中断
    5.1 提供中断机制,来干预线程之间的通信或协作。

三、用的哪种设计模式

     模板方法模式

四、AQS与锁二者之间的关系

  1. 锁是面向使用者的,它定义了使用者与锁交互的接口,隐藏了实现细节。
  2. 同步器是面向锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。
  3. 锁和同步器很好地隔离了使用者和实现者所需关注的领域。

看两张图吧:

以独占锁ReentrantLock为例:

ReentrantLock

ReentrantLock实现了Lock的接口,没有直接与AQS交互,而是通过一个内部Sync类继承AQS,将同步器的所有调用都映射到对应的Sync对应的方法。

ReentrantLock加锁方法 lock():

lock

查看 Sync的类图继承关系如下:

在这里插入图片描述

五、如何基于AQS实现一把独占锁

  1. 因为AQS内部帮我们把像多线程访问共享资源获取锁失败时,线程 入队、出队、阻塞、唤醒 提供好了,所以实现一把锁非常容易。
  2. 我们只需要关注加锁方法 tryAcquire 和释放锁资源方法 tryRelease 即可,其他的AQS已经为我们实现好了。

代码如下:

/*** Created with IntelliJ IDEA.* @Author: zhaoxn* @Date: 2022/11/25/21:51* @Description:基于AQS实现一把互斥锁*/
public class MutexLock extends AbstractQueuedSynchronizer{@Overrideprotected boolean tryAcquire(int unused) {//cas 加锁if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int unused) {//释放锁setExclusiveOwnerThread(null);setState(0);return true;}//调用AQS内部的tryAcquire方法获取锁,失败需要入队或成功直接返回public void lock() {acquire(1);}//调用自己重写的tryAcquire方法获取锁,失败或成功直接返回public boolean tryLock() {return tryAcquire(1);}//重写释放锁资源的方法,至于释放锁以后唤醒队列中阻塞的线程,交给AQS内部就好了public void unlock() {release(1);}}

六、参考资料

         Java并发编程的艺术

相关内容

热门资讯

原创 延... 10月12日,陕西延安宝塔区丰泽园小区突发路基塌陷滑坡,一处石坡的护坡墙被垮塌泥土冲垮,七八辆汽车被...
因劳动争议,贺雅新起诉*ST花... 天眼查APP显示,近日,贺雅新新增一则开庭公告,案由为“劳动争议”,原告为贺雅新,被告为花王生态工程...
因财产损害赔偿纠纷,赣粤高速起... 天眼查APP显示,近日,江西赣粤高速公路股份有限公司新增一则开庭公告,案由为“财产损害赔偿纠纷”,原...
最高法改判福清祖屋强拆案后:屋... 一起福建福清的祖屋被拆案引起最高检的关注。最终最高检提起抗诉,最高法对该案作出改判,认定福清市政府和...
因租赁合同纠纷,南京嘉源通驰技... 天眼查APP显示,近日,南京嘉源通驰技术有限公司新增一则开庭公告,案由为“租赁合同纠纷”,原告为南京...
因买卖合同纠纷,捷顺科技起诉天... 天眼查APP显示,近日,深圳市捷顺科技实业股份有限公司新增一则开庭公告,案由为“买卖合同纠纷”,原告...
因买卖合同纠纷,明阳电气起诉信... 天眼查APP显示,近日,广东明阳电气股份有限公司新增一则开庭公告,案由为“买卖合同纠纷”,原告为广东...
因买卖合同纠纷,万丰股份起诉杭... 天眼查APP显示,近日,浙江万丰化工股份有限公司新增一则开庭公告,案由为“买卖合同纠纷”,原告为浙江...
以制度建设提振企业发展信心 南方日报讯 (记者/姚瑶 见习记者/吴静涵)10月11日,省十四届人大常委会第二十一次会议表决通过《...