W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在Netty 4中為 ByteBuf 和 ByteBufHolder(兩者都實(shí)現(xiàn)了 ReferenceCounted 接口)引入了引用計(jì)數(shù)器。
引用計(jì)數(shù)器本身并不復(fù)雜;它能夠在特定的對(duì)象上跟蹤引用的數(shù)目,實(shí)現(xiàn)了ReferenceCounted 的類的實(shí)例會(huì)通常開始于一個(gè)活動(dòng)的引用計(jì)數(shù)器為 1。而如果對(duì)象活動(dòng)的引用計(jì)數(shù)器大于0,就會(huì)被保證不被釋放。當(dāng)數(shù)量引用減少到0,將釋放該實(shí)例。需要注意的是“釋放”的語義是特定于具體的實(shí)現(xiàn)。最起碼,一個(gè)對(duì)象,它已被釋放應(yīng)不再可用。
這種技術(shù)就是諸如 PooledByteBufAllocator 這種減少內(nèi)存分配開銷的池化的精髓部分。
Listing 5.16 Reference counting
Channel channel = ...;
ByteBufAllocator allocator = channel.alloc(); //1
....
ByteBuf buffer = allocator.directBuffer(); //2
assert buffer.refCnt() == 1; //3
...
1.從 channel 獲取 ByteBufAllocator
2.從 ByteBufAllocator 分配一個(gè) ByteBuf
3.檢查引用計(jì)數(shù)器是否是 1
Listing 5.17 Release reference counted object
ByteBuf buffer = ...;
boolean released = buffer.release(); //1
...
1.release()將會(huì)遞減對(duì)象引用的數(shù)目。當(dāng)這個(gè)引用計(jì)數(shù)達(dá)到0時(shí),對(duì)象已被釋放,并且該方法返回 true。
如果嘗試訪問已經(jīng)釋放的對(duì)象,將會(huì)拋出 IllegalReferenceCountException 異常。
需要注意的是一個(gè)特定的類可以定義自己獨(dú)特的方式其釋放計(jì)數(shù)的“規(guī)則”。 例如,release() 可以將引用計(jì)數(shù)器直接計(jì)為 0 而不管當(dāng)前引用的對(duì)象數(shù)目。
誰負(fù)責(zé) release?
在一般情況下,最后訪問的對(duì)象負(fù)責(zé)釋放它。在第6章我們會(huì)解釋 ChannelHandler 和 ChannelPipeline 的相關(guān)概念。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: