Netty之DefaultAttributeMap与AttributeKey的机制和原理

本文深入解析了Netty中的DefaultAttributeMap和AttributeKey,详细介绍了它们的结构、原理以及线程安全机制。讲解了valueOf和newInstance方法的工作方式,并探讨了在多线程环境下的行为。此外,还涵盖了ctx.channel().attr(key).set(T object)与get()的实现原理。
摘要由CSDN通过智能技术生成

一、介绍和原理分析

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 修饰的 引用类型在 类初始化阶段 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值