AQS是JDK并发工具包下的一个模板类,做为并发包下的工具工具基础实现,咱们常常使用的ReentrantLock,CountDownLatch,CyclicBarrier等都是基于它实现的,而且经过它咱们能够很容易的实现本身的同步机制。bash
做为JUC中这么重要的一个类,有些东西仍是要掌握的。数据结构
主要内容:并发
JDK源码要说原理,首先要提到其内部数据结构。其内部有两个子类:工具
另外AQS内部有一个state属性,AQS内部没有直接去操做state的地方,可是留给了咱们三个方法去操做它。主要用于标记同步器的状态学习
能提到几个点,我以为就OK了:ui
根据上面提到的原理,想要使用AQS这个类:spa
1 编写一个新类线程
2 重写AQS的模板方法code
3 利用AQS提供的基础方法补全模板方法,tryXXX开头的方法内容,已重入锁ReentrantLock为例,比较清晰。cdn
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
// c = 0表明没有线程修改过状态,那么尝试设置同步器的state。若是设置成功标记当前线程持有锁
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
// 若是当前的线程持有锁。state + 1
// 不然返回false,表明没法获取
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
复制代码
4 调用AQS提供的方法来使用,三个维度:是否可中断、是否共享、是否超时
关于AQS几个Acquire方法的区别:www.jianshu.com/p/c48793646…
简单来讲就是要知道try开头的方法是要咱们本身实现的。能提到try开头的方法便可,最好了解AQS内部的方法大体有哪些
常规区别:
再问一句,ReentrantLock提供的不一样获取锁的方式,好比超时获取,可中断获取,在AQS上的体现是什么呢?
即上面说的利用的是AQS的acquire,acquireInterruptibly,tryAcquireNanos。
至因而否公平的判断则是根据当前线程前是否仍有节点在等待。
了解了AQS的关键点以后,代码并非很复杂,主要知识点:维护双向链表,更新链表节点的状态,Lock.park,线程中断。
若是本身之后写模板类,AQS是一个很好的参照品。
其他也没太多想说的了,源码不是很复杂,因此没有贴源码出来