<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一小節剖析了從recycler中獲取一個物件, 這一小節分析在建立和回收是同執行緒的前提下, recycler是如何進行回收的
public static void main(String[] args){ User user1 = RECYCLER.get(); user1.recycle(); User user2 = RECYCLER.get(); user2.recycle(); System.out.println(user1==user2); }
這裡就是一個同執行緒回收物件的典型場景, 在一個執行緒中將物件建立並且回收, 我們的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方法實現物件回收的, 這裡實際呼叫的是DefaultHandle的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); } }
這裡首先判斷當前執行緒, 和建立stack的時候儲存的執行緒是否是同一執行緒, 如果是, 說明是同執行緒回收物件, 則執行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, 所以不會進入if塊, 我們繼續往下看
item.recycleId = item.lastRecycledId = OWN_THREAD_ID 這一步將handle的recycleId和lastRecycledId賦值為OWN_THREAD_ID, OWN_THREAD_ID在每一個recycle中是唯一固定的, 這裡我們只需要記得這個概念就行
如果size超過上限大小, 則直接返回
這裡還有個判斷dropHandle, 我們跟進去:
boolean dropHandle(DefaultHandle<?> handle) { if (!handle.hasBeenRecycled) { if ((++handleRecycleCount & ratioMask) != 0) { return true; } handle.hasBeenRecycled = true; } return false; }
if (!handle.hasBeenRecycled) 表示當前物件之前是否沒有被回收過, 如果是第一次回收, 這裡會返回true, 然後進入放到if
再看if中的判斷
if ((++handleRecycleCount & ratioMask) != 0)
handleRecycleCount表示當前位置stack回收了多少次物件(回收了多少次, 不代表回收了多少個物件, 因為不是每次回收都會被成功的儲存在stack), ratioMask我們之前分析過是7, 這裡 (++handleRecycleCount & ratioMask) != 0 表示回收的物件數如果不是8的倍數, 則返回true, 表示只回收1/8的物件
然後將hasBeenRecycled設定為true, 表示已經被回收
回到pushNow方法中:
如果size的大小等於stack中的陣列elements的大小, 則將陣列elements進行擴容
最後將size通過陣列下標的方式將當前handle設定到elements的元素中, 並將size進行自增
以上就是同執行緒回收物件的邏輯,更多關於Netty分散式同執行緒回收物件的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45