netty处理高并发,netty物联网高并发系统
00-1010同线程第三节demo中main方法的回顾。我们跟踪回收方法并获得当前大小。
00-1010上一节分析了如何从回收器获取一个对象,本节分析了在创建和回收是同一个线程的前提下,回收器如何回收它。
目录
public static void main(String[]args){ User User 1=recycler . get();user 1 . recycle();用户user 2=recycler . get();user 2 . recycle();system . out . println(user 1==user 2);}下面是一个在同一个线程中回收对象的典型场景。对象是在一个线程中创建和回收的,我们的用户对象定义了回收方法。
静态类用户{私有最终回收器。handle用户句柄;公共用户(回收者。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不属于句柄);} stack.push(这个);}这里,如果恢复的对象为null,就会抛出异常。
如果不为null,它会通过将自己绑定到堆栈的push方法将自己推入堆栈。
在推送方法中遵循:
void push(DefaultHandle?item){ Thread currentThread=Thread . current Thread();if(thread==current thread){ push now(item);} else { pushLater(item,current thread);}}这里首先判断当前线程是否与创建堆栈时保存的线程是同一线程。如果是,说明同一个线程回收了对象,然后执行pushNow方法将对象放入堆栈。
遵循pushNow方法中的:
私有void pushNow(DefaultHandle?item){ if((item . recycle id item . lastcrecycledid)!=0){ throw new IllegalStateException(已经回收);} item . recycle ID=item . last recycle did=OWN _ THREAD _ ID;int size=this.sizeif(size=max capacity drop handle(item)){ return;} if(size==elements . length){ elements=arrays . copy of(elements,min(size 1,max capacity));} elements[size]=item;this . size=size 1;}如果是第一次回收,item.recycleId和item.lastRecycledId都是0,所以不会进入if块。我们继续往下看。
项目。Recycledid=item。lastRecycledId=own _ thread _ id。在这一步中,handle的recycleId和lastrecycledid被赋给own _ thread _ id,own _ thread _ id是每次回收中唯一固定的。在这里,我们只需要记住这个概念。
00-1010如果大小超过上限大小,直接返回。
下面是另一个判断。dropHandle,我们:跟着进去吧
布尔型dropHandle(DefaultHandle?句柄){ if(!handle . hasbeenrecycled){ if((handlerecycleccount ratio mask)!=0) {返回true} handle.hasBeenRecycled=true}返回false}如果(!指示当前对象以前是否没有被回收过。如果是第一次回收,这里返回true,然后输入if。
再看看if里的判断。
if((handlerecycleccount比率掩码)!=0)
HandleRecycleCount表示当前位置的堆栈回收了多少次对象(回收了多少次,并不代表回收了多少对象,因为并不是每次回收都会成功保存在堆栈中)。我们之前分析的比率掩码是7,这里(handleRecycleCount ratioMask)!=0表示收集的对象数不是8的倍数,它返回true,表示只收集了1/8的对象。
然后将hasBeenRecycled设置为true,表示已经回收。
回到推送方法3360
如果大小等于堆栈中数组元素的大小,数组元素将被扩展。
最后,通过数组下标的方式将当前句柄设置为元素,大小自行递增。
以上是在同一个线程中回收对象的逻辑。关于Netty分布式回收同线程对象的更多信息,请关注风行IT的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。