掌握系列之并发编程-5.AQS和ReadWriteLock-创新互联

掌握高并发、高可用架构

第二课 并发编程

从本课开始学习并发编程的内容。主要介绍并发编程的基础知识、锁、内存模型、线程池、各种并发容器的使用。

站在用户的角度思考问题,与客户深入沟通,找到西市网站设计与西市网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计制作、成都网站设计、企业官网、英文网站、手机端网站、网站推广、申请域名、网络空间、企业邮箱。业务覆盖西市地区。
第五节 AQS和ReadWriteLock

并发编程 线程通信 AQS ReadWriteLock Lock

AQS:AbstractQueuedSynchronizer

在同步组件的实现过程中,AQS是核心部分,通过使用AQS的模板方法来实现同步语义。AQS包含同步队列的定义,以及对同步队列进行排队、等待通知等来实现的独占锁的获取和释放共享锁的获取和释放可中断锁超时等待锁等特性。

同步队列,即内部类Node
volatile int waitState; // 节点状态
volatile Node prev; // 当前节点的上一节点
volatile Node next; // 当前节点的下一节点
volatile Thread thread; // Node主体,线程
Node nextWaiter; // 等待队列中的下一节点

其中,节点状态的取值范围为:

int CANCELLED = 1; // 节点从队列中取消
int INITIAL = 0; // 初始状态
int SIGNAL = -1; // 下一节点处于等待状态,当当前线程释放锁后会通知下一节点,使其进入执行状态
int CONDITION = -2; // 当前节点进入等待状态
int PROPAGATE = -3; // 表示下一次共享状态获取将会无条件传播下去

显然,同步队列是一个双向链表。

另外,AQS中有两个很重要的变量:同步队列的头尾节点。

private transient volatile Node head;
private transient volatile Node tail;

AQS通过头尾指针来管理同步队列,同时实现包括获取锁失败的线程进入队列、释放锁时对同步队列进行通知等核心功能。

独占锁
void acquire(int arg); //独占式获取同步锁,如果获取失败则插入同步队列进行等待
void acquireInterruptibly(int arg); //与acquire相同,但在同步队列等待过程中可响应中断
boolean tryAcquireNanos(int arg, long nanos); //在acquireInterruptibly的基础上增加了超时等待的功能,在超时时间内没有获取到同步锁则返回false
boolean release(int arg); //释放锁,该方法会唤醒同步队列中的下一个节点
共享锁
void acquireShared(int arg); //共享式获取同步锁,与独占锁的区别是同一时刻可以有多个线程获取到同步状态
void acquireSharedInterruptibly(int arg); //在acquireShared基础上增加了响应中断的功能
boolean tryAcquireSharedNanos(int arg, long nanos); //在acquireSharedInterruptibly的基础上增加了超时等待的功能
boolean releaseShared(int arg); //释放共享式锁

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页标题:掌握系列之并发编程-5.AQS和ReadWriteLock-创新互联
网站URL:http://pwwzsj.com/article/dpppcj.html