netty-Buffer轻量级对象池实现分析

     netty是使用threadlocal变量来实现轻量级的对象池的,每个线程都拥有自己的对象池。netty自己实现了threadlocal语义,通过继承Thread类得到线程子类FastThreadLocalThread,FastThreadLocalThread持有一个成员变量InternalThreadLocalMap,每个线程将自己的对象池保存在这个变量对应的对象中。

UnpaddedInternalThreadLocalMap:是InternalThreadLocalMap的父类,其由许多属性构成,用于threadLocal的属性为一个Object数组indexedVariables,数组的每一位即对应一个threadLocal变量,threadLcoal变量可以操作这个位置(存取数据,数据类型由声明threadLocal变量时声明的泛型类型确定),而threadLocal对应位置的确定由UnpaddedInternalThreadLocalMap中的静态常量nextIndex确定,其是一个AtomicInteger类型,在threadLocal声明时,会获取nextIndex的最新值,同时nextIndex++。同时UnpaddedInternalThreadLocalMap还有一个类型为ThreadLocal<InternalThreadLocalMap>的静态变量slowThreadLocalMap,如果当前线程不是FastThreadLocalThread时,即没有成员变量InternalThreadLocalMap,因此通过该原生ThreadLocal变量来实现对象池,即将一个InternalThreadLocalMap对象保存在Thread的localMap中。(注意,ThreadLocal类型的变量是对应所有线程的,每个ThreadLocal变量的声明都会导致所有线程的Object数组位置被占用一个)。

InternalThreadLocalMap:提供一些静态方法用于对当前线程的InternalThreadLocalMap对象的Access。包括生成(只有真正使用时,才会为当前线程的InternalThreadLocalMap变量生成实际的对象),删除,存取。

FastThreadLocalThread:继承Thread。

FastThreadLocal:netty自己实现的ThreadLocal,用于对InternalThreadLocalMap类型中的成员变量Object数组indexedVariables进行操作。每个FastThreadLocal有一个成员变量index,在对象创建时会通过InternalThreadLocalMap的静态方法nextVariableIndex()对其进行赋值,实际是取InternalThreadLocalMap得静态成员变量nextIndex的最新值。index即代表其对Object数组indexedVariables的位置,表示该FastThreadLocal对象拥有该位置的控制权。

通过FastThreadLocalThread、InternalThreadLocalMap、FastThreadLocal这三个类,Netty就实现了一个底层是数组实现的ThreadLocal语义,相比于原生的通过Map实现的ThreadLocal其访问会变快。

Recycler:是一个根据netty自己实现的ThreadLocal语义实现的对象池。其有三个静态内部类Handle<T>、Stack<T>、WeakOrderQueue。2个FastThreadLocal属性(其中一个是静态的)。

             Handle<T>:是对象池的存储基本单位,每个handle对象持有实际存储的类型为T的对象

                Stack<T>:一个具有stack性质的对象池存储数据结构,也是实际保存在ThreadLoval对应的数组位置的对象结构。

      WeakOrderQueue:一个对象储备队列

FastThreadLocal<Stack>类型属性threadLocal:在InternalThreadLocalMap中存储一个Stack类型对象池。每个Recycler类的实例都会产生一个threadLocal对象,因此每个Recycler对象就是一个相应类型的对象池的实现,对于同一类型,一般是单例或者定义成静态变量。

static的FastThreadLocal<Map,WeakOrderQueue>>类型属性DELAYED_RECYCLED:同样是一个对象池,因为当一个handle需要回收时,这个handler不一定就在产生其的FastThreadLocalThread IO线程中,比如在自定义的业务线程池中执行完任务后需要回收对象,这样该handle就无法放回到IO线程对应的stack对象池中,因此需要定义一个static的对象池WeakOrderQueue,允许业务线程将需要回收的handle放入到对应的WeakOrderQueue中,这样当io线程需要获取新的handle时也就可以从对应的对象储备队列中获取。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的...
    BlackManba_24阅读 4,308评论 0 8
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,099评论 0 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 度过了一年的独行侠生活,大二返校的第三天。在看完综艺后回头一看发现室友们原来都出门了,有点丧啦…开始怀疑如果每天都...
    和我玩耍啊呵阅读 160评论 0 0
  • 我和妹妹的年龄差有点大,以前我都是在上学或是在外地,很少陪她们。其实和她们在一起,让我觉得我仿佛还是那个在田野间奔...
    伊人斓珊阅读 394评论 3 5