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