Netty的深入浅出--57.Netty常量池实现及ChannelOption与Attribute作用分析
接下来主要讲解ChannelOptions和AttributeKey对象以及他们之间的关系
简单来说channeloption是配置channelconfig的,而且还是以一种安全模式的情况下。
我们可以看到它的变量赋值,主要就是配置一些TCP/IP的一些属性配置
它继承的父类是AbstractConstant
而它又是constant的一个实现
constant是一个单例,通过ConstantPool来管理和创建
constants一个map 集合用来管理constant,返回的就是一个ConcurrentMap
获取一个为name的常量,如果没就创建该常量
constant进行了两次的判断。
主要原因是因为putIfAbsent()方法
因为如果两个线程一先一后进入到该第一个if判断,然后都new了一个tempConstant之后,第一个进入的执行完毕,第二个才到
putIfAbsent()判断,发现不能put了,里面存在了该变量,这个时候constant是null,所以需要通过第二个if语句来返回tempConstant。
总结ChannelOption:本身只负责维护一些常量的名字,而维护常量的值是在ConstantPool中创建和维护的
前面说到ChannelOption目的是为了配置ChannelConfig;
而channelConfig对channel进行配置
查看setOption()方法,可以看到它本身并不维护任何值,它维护的是值的类型。所以说channelOption是为了channelConfig服务的。channelConfig才是真正对channel进行配置
现在我们分析一下attributeKey
发现attributeKey继承abstractConstant,继承体系和ChannelOption是一样的。
和AttributeKey相关的一个组件Attribute
总结:AttributeKey里面含有Attribute,attributeMap通过从AttributeKey中的key获取相关的Attribute
attribut的作用:就是可以实现多个handler共享数据,当前面一个handler处理完之后,可以将需要共享给下一个handler的数据保存到attributeMap中发送给下一个handler,下个handler可以通过key值来获取相应的Attribut。