博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java并发】AQS学习
阅读量:4100 次
发布时间:2019-05-25

本文共 942 字,大约阅读时间需要 3 分钟。

      AQS的全称为(AbstractQueuedSynchronizer)这个类在java.util.concurrent.locks包。AQS作为一个核心的处理框架,他提供了大量的同步操作,同时用户还可以在此类的基础上进行自定义,实现自己的同步器。其主要框架如下:AQS是JUC同步器的基石,下面就AQS涉及的技术原理简单阐述:

转载:

       AQS的核心思想:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列,虚拟的双向队列即不存在队列实例,仅存在节点之间的关联关系。

AQS是将每一条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node),来实现锁的分配。

转载:

用大白话来说,AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。**注意:AQS是自旋锁:**在等待唤醒的时候,经常会使用自旋(while(!cas()))的方式,不停地尝试获取锁,直到被其他线程获取成功

实现了AQS的锁有:自旋锁、互斥锁、读锁写锁、条件产量、信号量、栅栏都是AQS的衍生物

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

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

1.Exclusive:独占,只有一个线程能执行,如ReentrantLock
2.Share:共享,多个线程可以同时执行,如Semaphore、CountDownLatch、ReadWriteLock,CyclicBarrier

不同的自定义的同步器争用共享资源的方式也不同。

 

AQS源码详解

转载:

你可能感兴趣的文章
音视频干货|深入Storyteller:实时协同Tutorial编辑器
查看>>
年轻人不讲武德,竟然重构出这么优雅后台 API 接口
查看>>
这份笔记研究完,进大厂是个“加分项”...
查看>>
写代码有这16个好习惯,可以减少80%非业务的bug
查看>>
《我想进大厂》之Spring夺命连环10问
查看>>
空指针的传说
查看>>
为什么阿里巴巴禁止使用 Executors 创建线程池?
查看>>
面试官问我平时怎么看源码的,我把这篇文章甩给他了。
查看>>
这十一条程序员必备软技能,你一定要知道
查看>>
为什么你写的拦截器中不能注入Java bean?
查看>>
2020 年度编程语言排行榜出炉!C 语言称霸,Java 遭遇滑铁卢…….
查看>>
Android中屏幕密度和图片大小的关系分析
查看>>
树立个人品牌:让名企hr们主动来找你
查看>>
Ubuntu上Lamp的搭建
查看>>
Android内核解读-Android系统的开机启动过程
查看>>
Android内核解读-应用的安装过程
查看>>
Android Binder机制浅析
查看>>
killall & killall -9
查看>>
linux top %VSZ含义
查看>>
gcc 编译顺序问题
查看>>