Netty引用計數(shù)器

2018-08-03 11:53 更新

在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)概念。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號