Java多线程系列--AQS的原理

约定不等于承诺〃 2023-10-02 13:47 91阅读 0赞

原文网址:Java多线程系列—AQS的原理_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Java中的AQS的原理。

Java的AQS是JDK自带的锁机制,是JUC(java.util.concurrent)的基础,很多并发类都是基于它实现的,例如:ReentrantLock、CountDownLatch、Semaphore、ReadWriteLock,CyclicBarrier。

概述

名词含义

AQS:全名为AbstractQuenedSynchronizer,是抽象的队列式同步器。AQS是除了synchronized关键字之外的锁机制,全限定类名为:java.util.concurrent.locks.AbstractQueuedSynchronizer.java

AQS的原理

AQS原理:基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态,成功则获取锁成功,失败则进入等待队列,等待被唤醒。

CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列,虚拟的双向队列即不存在队列实例,仅存在节点之间的关联关系。AQS将每一条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node),来实现锁的分配。

AQS用CLH队列锁实现,将暂时获取不到锁的线程加入到队列中:

  • 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态。
  • 如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制(AQS)。

AQS是自旋锁

在等待唤醒的时候,经常会使用自旋(while(!cas()))的方式,不停地尝试获取锁,直到获取成功。

AQS实现的具体方式

b850a83180bce23ed7370634aca2c143.png

如图所示,AQS维护了一个volatile int state和一个FIFO线程等待队列,多线程争用资源被阻塞的时候就会进入这个队列。state就是共享资源,其访问方式有三种:getState(); setState(); compareAndSetState()。

上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-AQS的原理 - 自学精灵

发表评论

表情:
评论列表 (有 0 条评论,91人围观)

还没有评论,来说两句吧...

相关阅读