Netty分布式高性能工具類同線程下回收對象解析
同線程回收對象
上一小節(jié)剖析了從recycler中獲取一個對象, 這一小節(jié)分析在創(chuàng)建和回收是同線程的前提下, recycler是如何進(jìn)行回收的
回顧第三小節(jié)的demo中的main方法
public static void main(String[] args){ User user1 = RECYCLER.get(); user1.recycle(); User user2 = RECYCLER.get(); user2.recycle(); System.out.println(user1==user2); }
這里就是一個同線程回收對象的典型場景, 在一個線程中將對象創(chuàng)建并且回收, 我們的User對象定義了recycle方法
static class User{ private final Recycler.Handle<User> handle; public User(Recycler.Handle<User> handle){ this.handle=handle; } public void recycle(){ handle.recycle(this); } }
這里的recycle是通過handle對象的recycle方法實現(xiàn)對象回收的, 這里實際調(diào)用的是DefaultHandle的recycle方法
我們跟進(jìn)recycle方法
public void recycle(Object object) { if (object != value) { throw new IllegalArgumentException("object does not belong to handle"); } stack.push(this); }
這里如果回收的對象為null, 則拋出異常
如果不為null, 則通過自身綁定stack的push方法將自身push到stack中
跟到push方法中:
void push(DefaultHandle<?> item) { Thread currentThread = Thread.currentThread(); if (thread == currentThread) { pushNow(item); } else { pushLater(item, currentThread); } }
這里首先判斷當(dāng)前線程, 和創(chuàng)建stack的時候保存的線程是否是同一線程, 如果是, 說明是同線程回收對象, 則執(zhí)行pushNow方法將對象放入stack中
跟到pushNow方法中:
private void pushNow(DefaultHandle<?> item) { if ((item.recycleId | item.lastRecycledId) != 0) { throw new IllegalStateException("recycled already"); } item.recycleId = item.lastRecycledId = OWN_THREAD_ID; int size = this.size; if (size >= maxCapacity || dropHandle(item)) { return; } if (size == elements.length) { elements = Arrays.copyOf(elements, min(size << 1, maxCapacity)); } elements[size] = item; this.size = size + 1; }
如果第一次回收, item.recycleId和item.lastRecycledId都為0, 所以不會進(jìn)入if塊, 我們繼續(xù)往下看
item.recycleId = item.lastRecycledId = OWN_THREAD_ID 這一步將handle的recycleId和lastRecycledId賦值為OWN_THREAD_ID, OWN_THREAD_ID在每一個recycle中是唯一固定的, 這里我們只需要記得這個概念就行
然后獲取當(dāng)前size
如果size超過上限大小, 則直接返回
這里還有個判斷dropHandle, 我們跟進(jìn)去:
boolean dropHandle(DefaultHandle<?> handle) { if (!handle.hasBeenRecycled) { if ((++handleRecycleCount & ratioMask) != 0) { return true; } handle.hasBeenRecycled = true; } return false; }
if (!handle.hasBeenRecycled) 表示當(dāng)前對象之前是否沒有被回收過, 如果是第一次回收, 這里會返回true, 然后進(jìn)入放到if
再看if中的判斷
if ((++handleRecycleCount & ratioMask) != 0)
handleRecycleCount表示當(dāng)前位置stack回收了多少次對象(回收了多少次, 不代表回收了多少個對象, 因為不是每次回收都會被成功的保存在stack), ratioMask我們之前分析過是7, 這里 (++handleRecycleCount & ratioMask) != 0 表示回收的對象數(shù)如果不是8的倍數(shù), 則返回true, 表示只回收1/8的對象
然后將hasBeenRecycled設(shè)置為true, 表示已經(jīng)被回收
回到pushNow方法中:
如果size的大小等于stack中的數(shù)組elements的大小, 則將數(shù)組elements進(jìn)行擴容
最后將size通過數(shù)組下標(biāo)的方式將當(dāng)前handle設(shè)置到elements的元素中, 并將size進(jìn)行自增
以上就是同線程回收對象的邏輯,更多關(guān)于Netty分布式同線程回收對象的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于JFormDesigner的安裝及破解超詳細(xì)教程
JFormDesigner是一種先進(jìn)的圖形用戶界面Swing?的設(shè)計工具(非開源),具有一個獨立的開發(fā)工具產(chǎn)品和基于不同開發(fā)工具如Eclipse、NetBeans等的開發(fā)插件,本文給大家介紹JFormDesigner安裝破解教程,感興趣的朋友一起看看吧2023-12-12基于Java設(shè)計一個高并發(fā)的秒殺系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Java設(shè)計一個高并發(fā)的秒殺系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下2023-10-10