本文概要
在AQS(1)中,从ReentrantLock入手,分析了获取和释放锁的源代码;在AQS(2)中,走了一遍Condition条件队列的等待与唤醒。
在两篇文章中,都只是找了典型的几个方法,如ReentrantLock
的lock()
/unlock()
,以及
Condition
的await()
/signal()
。事实上,还有带超时机制,和中断机制的方法,本文就来查漏补缺,大概过一遍
这几个方法。
在AQS(1)中,从ReentrantLock入手,分析了获取和释放锁的源代码;在AQS(2)中,走了一遍Condition条件队列的等待与唤醒。
在两篇文章中,都只是找了典型的几个方法,如ReentrantLock
的lock()
/unlock()
,以及
Condition
的await()
/signal()
。事实上,还有带超时机制,和中断机制的方法,本文就来查漏补缺,大概过一遍
这几个方法。
Condition
简介Condition
的await()
/signal()
/signalAll()
方法提供了Object
的wait()
/notify()
/notifyAll()
方法的替代品;
此外,还对其进行了增强:一个锁可以有多个Condition
队列,以实现精准的唤醒。
本文主要通过源码来看看Condition
在AQS
里是怎么实现的。
AQS
简介AbstractQueuedSynchronizer,抽象队列同步器,为JUC包中的各阻塞锁和同步器 提供了一个框架,其基于一个FIFO队列(CLH队列的一种变体),以模板设计模式,为大 多数同步器提供了一个基本的实现。
Node
:队列节点类Node
类是AQS
的FIFO等待队列的节点类,其主要有以下字段属性:
```java
// 共享模式下等待的节点标记
static final Node SHARED = new Node();
// 独占模式下等待的节点标记
static final Node EXCLUSIVE = null;
1 |
|
JDK8 中HashMap
的putVal
方法工作流程图:
先说结论:采用集群+镜像队列
的方式提高可用性
在rabbitMQ的集群模式下,集群中所有节点都会备份所有的元数据信息,包括:
适配器将被适配的类的方法适配成客户端所期待的方法;
或者说,适配器将不同类的方法统一成某个接口的一个方法,方便客户端进行调用;
如:客户端想调用类A的方法a,但是客户端的代码实现中只能调用接口B的b方法,此时可以用C类去实现B接口,并在b方法里,调用A类的a方法;