一、介绍和原理分析
1.什么是 DefaultAttributeMap?
DefaultAttributeMap 是一个 数组 + 链表 结构的线程安全 Map 。
2.什么是 AttributeKey?
AttributeKey 可以想象成一个缓存 set ,存放了一组 key 的集合,与 DefaultAttributeMap 之间的关系是,后者中的一个 哈希图 存放键值对( k-v )的 v 即是 AttributeKey 。
有了 AttributeKey ,你自然会想到 Attribute ,两者之间又有什么关系呢?下面会讲,慢慢理解,跟着我思路!
3. 什么是 Attribute?
Attribute 顾名思义,就是与 AttributeKey 是一对的,形象一点说就是你跟你的对象(老婆),而你就是 key ,是一对一的,不能是一对多的关系
凭什么是一对一,也就是凭什么你只能有一个对象?
AttributeKey 它受 DefaultAttributeMap 中的内部类 DefaultAttribute 约束,前面说了 DefaultAttributeMap 的结构是以数组和链表的形式,其实它的最小单元(结点)就是 DefaultAttribute 。
4. 关于数组和链表的结构
- 数组采用的是 AtomicReferenceArray , 链表 中 节点为 DefaultAttribute 结构;DefaultAttribute 继承了 AtomicReference ,所以也是具有与 AtomicReference 相同的原子操作;数组和链表都是线程安全的;
5. DefaultAttributeMap 与 AtomicReferenceArray 的关系图
其中,每个节点 DefaultAttribute 的字段就没有详细画出来
数组默认创建大小为4,如下图所示
6. valueOf("key")原理
默认情况下,第一次存放 key 值时,一般使用 AttributeKey.valueOf("rpcResponse") ,此时在 AttributeKey 中的常量池会随之创建,并初始化好 ConcurrentHashMap ,下面通过源码追踪
使用 AttributeKey 的静态方法 valueOf("key")
public final class AttributeKey<T> extends AbstractConstant<AttributeKey<T>> {
// static final 修饰的 引用类型在 类初始化阶段