【java基础】线程笔记——AQS(AbstractQueuedSynchronizer)
2017-04-10 11:07
639 查看
AQS : java.util.concurrent.locks.AbstractQueuedSynchronizer
研究java.util.concurrent并发包的突破口(例如: ReentrantLock核心是内部类Sync,然而Sync继承AQS)
线程阻塞队列的维护
线程阻塞和唤醒
共享变量的修改都是通过Unsafe类提供的CAS操作完成的
AbstractQueuedSynchronizer类的主要方法是acquire和release(模板方法)
acquire方法用来获取锁,返回true说明线程获取成功继续执行,一旦返回false则线程加入到等待队列中,等待被唤醒。
release方法用来释放锁。 一般来说实现的时候这两个方法被封装为lock和unlock方法。
AQS概念理解
并发编程AQS参考
AQS系列博文
研究java.util.concurrent并发包的突破口(例如: ReentrantLock核心是内部类Sync,然而Sync继承AQS)
AQS核心
通过一个共享变量来同步状态,变量的状态由子类去维护,线程阻塞队列的维护
线程阻塞和唤醒
共享变量的修改都是通过Unsafe类提供的CAS操作完成的
AbstractQueuedSynchronizer类的主要方法是acquire和release(模板方法)
protected boolean tryAcquire(int arg) protected boolean tryRelease(int arg) protected int tryAcquireShared(int arg) protected boolean tryReleaseShared(int arg)
acquire方法用来获取锁,返回true说明线程获取成功继续执行,一旦返回false则线程加入到等待队列中,等待被唤醒。
release方法用来释放锁。 一般来说实现的时候这两个方法被封装为lock和unlock方法。
AQS思路
在获取锁时候,先判断当前状态是否允许获取锁,若是可以则获取锁,否则获取不成功。获取不成功则会阻塞,进入阻塞队列。而释放锁时,一般会修改状态位,唤醒队列中的阻塞线程/** * 锁同步的基础Sync类 * AQS代表持有锁的数量 */ abstract static class Sync extends AbstractQueuedSynchronizer { abstract void lock(); final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { free = true; setExclusiveOwnerThread(null); } setState(c); return free; } protected final boolean isHeldExclusively() { return getExclusiveOwnerThread() == Thread.currentThread(); } final ConditionObject newCondition() { return new ConditionObject(); } final Thread getOwner() { return getState() == 0 ? null : getExclusiveOwnerThread(); } final int getHoldCount() { return isHeldExclusively() ? getState() : 0; } final boolean isLocked() { return getState() != 0; } private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); setState(0); } }
AQS概念理解
并发编程AQS参考
AQS系列博文
相关文章推荐
- Java并发同步器AQS(AbstractQueuedSynchronizer)学习笔记(1)
- Java 线程 — AbstractQueuedSynchronizer
- Java并发同步器AQS(AbstractQueuedSynchronizer)学习笔记(2)
- java基于AbstractQueuedSynchronizer实现资源共享锁,限制并发线程数目
- 深入学习java并发编程:Lock与AbstractQueuedSynchronizer(AQS)实现
- java类库的阅读笔记_jdk1.7.0_40_java.util.concurrent.locks.AbstractQueuedSynchronizer
- java中的队列同步器AQS -- AbstractQueuedSynchronizer
- Java并发之AQS(AbstractQueuedSynchronizer)原理讲解
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
- Java 线程 — AbstractQueuedSynchronizer
- [置顶] java中的队列同步器AQS -- AbstractQueuedSynchronizer
- AbstractQueuedSynchronizer与synchronized优缺对比及AQS 源码分析笔记
- Java中的锁 (3) 同步器AQS (AbstractQueuedSynchronizer)
- 黑马程序言 Java基础学习笔记12 线程的创建
- JAVA学习笔记——JAVA基础语法--线程(九)
- java类库concurrent中最核心类型AbstractQueuedSynchronizer的学习
- java线程基础——笔记2
- java AbstractQueuedSynchronizer的实现分析(独占锁)
- 深度解析Java 8:JDK1.8 AbstractQueuedSynchronizer的实现分析(上)
- java AbstractQueuedSynchronizer的实现分析(共享锁)