Java并发编程系列:搞透AQS原理(流程图及队列图解)

Java并发编程系列:搞透AQS原理(流程图及队列图解)在并发编程领域 AQS 号称是并发同步组件的基石 很多并发同步组件都是基于 AQS 实现 所以想掌握好高并发编程 你需要掌握好 AQS mikechen

欢迎大家来到IT世界,在知识的湖畔探索吧!

Java并发编程系列:搞透AQS原理(流程图及队列图解)

在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS@mikechen

本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程,让你对AQS的整体设计有清晰了解,让你迈出高并发编程的第一步。

AQS简介

AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。

AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,比如大家熟知的:

  • ReentrantLock
  • Semaphore
  • CountDownLatch
  • CyclicBarrier

等并发类均是基于AQS来实现的。

AQS的数据模型

Java并发编程系列:搞透AQS原理(流程图及队列图解)

AQS 使用上图的资源变量 state来表示同步状态,通过内置的 CLH FIFO 队列来完成获取资源线程的排队工作,这里会涉及到三个要素:

1.AQS的三个核心成员变量

Java并发编程系列:搞透AQS原理(流程图及队列图解)

  • 共享资源:volatile int state(代表共享状态)
  • 队头节点:head头节点
  • 队尾节点:tail尾节点

head、tail、state三个变量都是volatile的,通过volatile来保证共享变量的可见性。

2.AQS中state状态的变更是基于CAS实现的

主要有三种方法:

  • getState()
  • setState()
  • compareAndSetState()
Java并发编程系列:搞透AQS原理(流程图及队列图解)

state状态通过volatile保证共享变量的可见性,再由CAS 对该同步状态进行原子操作,从而保证原子性和可见性。

3.CLH队列(FIFO队列)

CLH队列通过内置的FIFO队列(Node来实现),来完成线程等待排队 (多线程争用资源被阻塞时会进入此队列)。

AQS资源共享方式

AQS定义两种资源共享方式:

Java并发编程系列:搞透AQS原理(流程图及队列图解)

1.独占锁Exclusive

独占模式下时,其他线程试图获取该锁将无法取得成功,只有一个线程能执行,如ReentrantLock采用独占模式。

ReentrantLock还可以分为公平锁和非公平锁:

  • 公平锁:按照线程在队列中的排队顺序,先到者先拿到锁
  • 非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的

2.共享锁shared

多个线程获取某个锁可能会获得成功,多个线程可同时执行,如:Semaphore、CountDownLatch。

AQS的锁获取与释放原理

Java并发编程系列:搞透AQS原理(流程图及队列图解)

1.线程获取锁流程:

  • 线程A获取锁,state将0置为1,线程A占用
  • 在A没有释放锁期间,线程B也来获取锁,线程B获取state为1,表示线程被占用,线程B创建Node节点放入队尾(tail),并且阻塞线程B
  • 同理线程C获取state为1,表示线程被占用,线程C创建Node节点,放入队尾,且阻塞线程

2.线程释放锁流程:

  • 线程A执行完,将state从1置为0
  • 唤醒下一个Node B线程节点,然后再删除线程A节点
  • 线程B占用,获取state状态位,执行完后唤醒下一个节点 Node C,再删除线程B节点

更加详细的锁获取和释放过程,建议通过查看源码的方式学习AQS独占模式和共享模式下的获取锁过程。

AQS总结

本文主要介绍AQS的数据模型、CLH队列、资源共享方式、以及锁的获取与释放流程,来介绍AQS的实现原理

让大家能对AQS有一个整体的了解,只有对整体的设计方向有清晰了解,再去跟踪学习源码就会比较轻松了。

后续将详细介绍基于AQS实现的同步组件:ReentrantLock、Semaphore、CountDownLatch。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/89542.html

(0)
上一篇 2024年 11月 21日 上午11:05
下一篇 2024年 11月 21日 上午11:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信