Java多线程系列--AQS的原理
原文网址: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实现的具体方式
如图所示,AQS维护了一个volatile int state和一个FIFO线程等待队列,多线程争用资源被阻塞的时候就会进入这个队列。state就是共享资源,其访问方式有三种:getState(); setState(); compareAndSetState()。
上边是文章的部分内容,为便于维护,全文已迁移到此网址:Java-AQS的原理 - 自学精灵
还没有评论,来说两句吧...