本文概要
在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方法;