1. 首页
  2. 未分类

高并发编程系列:全面剖析Java并发编程之AQS的核心实现

“u003Cpu003E在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS。u003Cu002Fpu003Eu003Cpu003E本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程,让你对AQS的整体设计有清晰了解,让你迈出高并发编程的第一步。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003EAQSu003Cu002Fh1u003Eu003Cpu003EAQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。u003Cu002Fpu003Eu003Cpu003EAQS的主要作用是为Java中的并发同步组件提供统一的底层支持,比如大家熟知的:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003EReentrantLocku003Cu002Fliu003Eu003Cliu003ESemaphoreu003Cu002Fliu003Eu003Cliu003ECountDownLatchu003Cu002Fliu003Eu003Cliu003ECyclicBarrieru003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E等并发类均是基于AQS来实现的。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003EAQS的数据模型u003Cu002Fh1u003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002Fd950ff4d354843d5afcc5037db9b5d5e” img_width=”1709″ img_height=”667″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003EAQS 使用上图的资源变量 state来表示同步状态,通过内置的 CLH FIFO 队列来完成获取资源线程的排队工作,这里会涉及到三个要素:u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E1.AQS的三个核心成员变量u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F21e50bf3ed124957b55b1b29126b4e07″ img_width=”1195″ img_height=”774″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cul class=””u003Eu003Cliu003E共享资源:volatile int state(代表共享状态)u003Cu002Fliu003Eu003Cliu003E队头节点:head头节点u003Cu002Fliu003Eu003Cliu003E队尾节点:tail尾节点u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Ehead、tail、state三个变量都是volatile的,通过volatile来保证共享变量的可见性。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E2.AQS中state状态的变更是基于CAS实现的u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E主要有三种方法:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003EgetState()u003Cu002Fliu003Eu003Cliu003EsetState()u003Cu002Fliu003Eu003Cliu003EcompareAndSetState()u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002F32458e862b414ad8bf7b7595f79be7f5″ img_width=”1119″ img_height=”774″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Estate状态通过volatile保证共享变量的可见性,再由CAS 对该同步状态进行原子操作,从而保证原子性和可见性。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E3.CLH队列(FIFO队列)u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003ECLH队列通过内置的FIFO队列(u003Cstrongu003ENode来实现u003Cu002Fstrongu003E),来完成线程等待排队 (多线程争用资源被阻塞时会进入此队列)。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003EAQS资源共享方式u003Cu002Fh1u003Eu003Cpu003EAQS定义两种资源共享方式:u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F828d86ddd56a4f1f94d2bb3fb21b042e” img_width=”748″ img_height=”727″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E1.独占锁Exclusiveu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E独占模式下时,其他线程试图获取该锁将无法取得成功,只有一个线程能执行,如ReentrantLock采用独占模式。u003Cu002Fpu003Eu003Cpu003EReentrantLock还可以分为公平锁和非公平锁:u003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003E公平锁:按照线程在队列中的排队顺序,先到者先拿到锁u003Cu002Fliu003Eu003Cliu003E非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E2.共享锁sharedu003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E多个线程获取某个锁可能会获得成功,多个线程可同时执行,如:Semaphore、CountDownLatch。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003EAQS的锁获取与释放原理u003Cu002Fh1u003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fe1526e9a57c143ddb384686a9dd6ce73″ img_width=”548″ img_height=”858″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003Eu003Cstrongu003E1.线程获取锁流程:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003E线程A获取锁,state将0置为1,线程A占用u003Cu002Fliu003Eu003Cliu003E在A没有释放锁期间,线程B也来获取锁,线程B获取state为1,表示线程被占用,线程B创建Node节点放入队尾(tail),并且阻塞线程Bu003Cu002Fliu003Eu003Cliu003E同理线程C获取state为1,表示线程被占用,线程C创建Node节点,放入队尾,且阻塞线程u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E2.线程释放锁流程:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cul class=””u003Eu003Cliu003E线程A执行完,将state从1置为0u003Cu002Fliu003Eu003Cliu003E唤醒下一个Node B线程节点,然后再删除线程A节点u003Cu002Fliu003Eu003Cliu003E线程B占用,获取state状态位,执行完后唤醒下一个节点 Node C,再删除线程B节点u003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E更加详细的锁获取和释放过程,建议通过查看源码的方式学习AQS独占模式和共享模式下的获取锁过程。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003EAQS总结u003Cu002Fh1u003Eu003Cpu003E本文主要介绍AQS的数据模型、CLH队列、资源共享方式、以及锁的获取与释放流程,来介绍AQS的实现原理u003Cu002Fpu003Eu003Cpu003E让大家能对AQS有一个整体的了解,只有对整体的设计方向有清晰了解,再去跟踪学习源码就会比较轻松了。u003Cu002Fpu003Eu003Cpu003E后续将详细介绍基于AQS实现的同步组件:ReentrantLock、Semaphore、CountDownLatch。u003Cu002Fpu003Eu003Ch1 class=”pgc-h-arrow-right”u003E更多高并发架构专题u003Cu002Fh1u003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002Fcf4e3daab4f040f8b9f138a3789a770c” img_width=”930″ img_height=”529″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Ch1 class=”pgc-h-arrow-right”u003E该资料获取方式u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E关注+转发后,私信我关键词 【高并发】即可获取!u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003Eu003Cbru002Fu003Eu003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F15318856260738ab7e732e2″ img_width=”632″ img_height=”207″ alt=”高并发编程系列:全面剖析Java并发编程之AQS的核心实现” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:高并发编程系列:全面剖析Java并发编程之AQS的核心实现

主题测试文章,只做测试使用。发布者:IT资讯科技,转转请注明出处:http://www.cxybcw.com/26212.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code