99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Netty引用計(jì)數(shù)器

2018-08-03 11:53 更新

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)