unsafe
-
首先 每个channel都内生的天然的必须有对应的unsafe类型,这从AbstractChannel的构造器便可得知
-
其次 unsafe接口中定义的方法,包含了channel接口中所有的IO操作方法(读/写/connect/register),且更丰富了些其他方法,包括了disconnect/deregister/close/closeForcibly/beginRead这些channel中反向或者补充的方法,由此可以判断的是,channel的生命周期控制点在unsafe。类似章句行话之起转承合
a AbstractUnsafe中的register方法 采用了模板模式
b AbstractUnsafe中的register0方法
c doRegister方法 是一个子类需要实现的方法 同时在可以read io数据的时候 进行读取数据
以AbstractNioChannel为样例
doRegister 赋值nio中的一个selecionKey
doBeginRead 读取selectionKey 控制readPending变量
然后通过eventloop的子类去实现读取java selcetor channel中的数据 比如NioEventLoop
- 再者 unsafe的最后实现子类,都是private作为修饰,因此它是一个闭包封闭的,相当于scala中的seal的概念,只能在当前类中使用
- 因此channel如要想使用起来,必须要透过channel所对应的unsafe,来进行注册到eventloop中,bind/connect一个确定scoketAddress
图中的eventloop