返回顶部
首页 > 资讯 > 精选 >Netty分布式从recycler对象回收站获取对象的方法
  • 630
分享到

Netty分布式从recycler对象回收站获取对象的方法

2023-06-29 17:06:07 630人浏览 泡泡鱼
摘要

本篇内容主要讲解“Netty分布式从recycler对象回收站获取对象的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Netty分布式从recycler对象回收站获取对象的方法”吧!从对象回

本篇内容主要讲解“Netty分布式从recycler对象回收站获取对象的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Netty分布式从recycler对象回收站获取对象的方法”吧!

从对象回收站中获取对象

从回收站获取对象

public static void main(String[] args){    User user1 = RECYCLER.get();    user1.recycle();    User user2 = RECYCLER.get();    user2.recycle();    System.out.println(user1==user2);}

这个通过Recycler的get方法获取对象, 我们跟到get方法中:

public final T get() {    if (maxCapacityPerThread == 0) {        return newObject((Handle<T>) NOOP_HANDLE);    }    Stack<T> stack = threadLocal.get();    DefaultHandle<T> handle = stack.pop();    if (handle == null) {        handle = stack.newHandle();        handle.value = newObject(handle);    }    return (T) handle.value;}

首先判断maxCapacityPerThread是否为0, maxCapacityPerThread代表stack最多能缓存多少个对象, 如果缓存0个, 说明对象将一个都不会回收

这个通过调用newObject创建一个对象, 并传入一个NOOP_HANDLE, NOOP_HANDLE是一个handle, 我们看其定义:

private static final Handle NOOP_HANDLE = new Handle() {    @Override    public void recycle(Object object) {            }};

这里的recycle方法是一个空实现, 代表不进行任何对象回收

回到get方法中

我们看第二步 

Stack<T> stack = threadLocal.get(); 

这里通过FastThreadLocal对象拿到当前线程的stack, 有关FastThreadLocal获取对象的逻辑之前小节剖析过, 这里不再赘述

获取stack之后, 从stack中pop出一个handle, 这个handle做用我们稍后分析

如果取出的对象为null, 说明当前回收站内没有任何对象, 通常第一次执行到这里对象还没回收, 这里就会是null, 这样则会通过stack.newHandle()创建一个handle

创建出来的handle的value属性, 通过我们重写的newObject方法进行赋值, 也就是我们demo中的user

我们跟进newHandle方法

DefaultHandle<T> newHandle() {    return new DefaultHandle<T>(this);}

这里创建一个DefaultHandle对象, 并传入this, 这里的this是当前stack

跟到DefaultHandle的构造方法中:

DefaultHandle(Stack<?> stack) {    this.stack = stack;}

这里初始化了stack属性

DefaultHandle中还有个value的成员变量

private Object value;

这里的value就用来绑定回收的对象本身

回到get方法中:

分析handle, 我们回到上一步:

DefaultHandle<T> handle = stack.pop();

我们分析从stack中弹出一个handle的逻辑

跟到pop方法中

DefaultHandle<T> pop() {    int size = this.size;    if (size == 0) {        if (!scavenge()) {            return null;        }        size = this.size;    }    size --;    DefaultHandle ret = elements[size];    elements[size] = null;    if (ret.lastRecycledId != ret.recycleId) {        throw new IllegalStateException("recycled multiple times");    }    ret.recycleId = 0;    ret.lastRecycledId = 0;    this.size = size;    return ret;}

首先拿到size, size表示当前stack的对象数

如果size为0, 则调用scavenge方法, 这个方法是异线程回收对象的方法, 我们放在之后的小节进行分析

size大于零, 则size进行自减, 代表取出一个元素

然后通过size的数组下标的方式将handle取出

之后将当前下标设置为null

最后将属性recycleId, lastRecycledId, size进行赋值

recycleId和lastRecycledId我们会在之后的小节进行分析

回到get方法中:

public final T get() {    if (maxCapacityPerThread == 0) {        return newObject((Handle<T>) NOOP_HANDLE);    }    Stack<T> stack = threadLocal.get();    DefaultHandle<T> handle = stack.pop();    if (handle == null) {        handle = stack.newHandle();        handle.value = newObject(handle);    }    return (T) handle.value;}

无论是从stack中弹出的handle, 还是创建的handle, 最后都要通过handle.value拿到我们实际使用的对象

到此,相信大家对“Netty分布式从recycler对象回收站获取对象的方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Netty分布式从recycler对象回收站获取对象的方法

本文链接: https://lsjlt.com/news/325938.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Netty分布式从recycler对象回收站获取对象的方法
    本篇内容主要讲解“Netty分布式从recycler对象回收站获取对象的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Netty分布式从recycler对象回收站获取对象的方法”吧!从对象回...
    99+
    2023-06-29
  • Netty分布式从recycler对象回收站获取对象过程剖析
    前文传送门:Netty分布式高性能工具类recycler的使用及创建 从对象回收站中获取对象 我们回顾上一小节demo的main方法中 从回收站获取对象 public static ...
    99+
    2024-04-02
  • Netty分布式获取异线程释放对象源码剖析
    目录获取异线程释放对象在介绍之前我们首先看Stack类中的两个属性我们跟到pop方法中继续跟到scavengeSome方法中我们继续分析transfer方法接着我们我们关注一个细节我...
    99+
    2024-04-02
  • Netty分布式高性能工具类异线程下回收对象分析
    这篇文章主要介绍“Netty分布式高性能工具类异线程下回收对象分析”,在日常操作中,相信很多人在Netty分布式高性能工具类异线程下回收对象分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Netty分布式高...
    99+
    2023-06-29
  • Netty分布式高性能工具类异线程下回收对象解析
    目录异线程回收对象跟到pushLater方法中跟到allocate方法中回到pushLater方法中简单看下link的类的定义回到pushLater方法中前文传送门:Netty分布式...
    99+
    2024-04-02
  • Netty分布式高性能工具类同线程下回收对象解析
    目录同线程回收对象回顾第三小节的demo中的main方法我们跟进recycle方法然后获取当前size同线程回收对象 上一小节剖析了从recycler中获取一个对象, 这一小节分析在...
    99+
    2024-04-02
  • JQuery获取对象的方式介绍
    一、引用 官网下载对应的jquery版本文件,在需要用到jquery的地方,用script标签引入进来 <head> <script src="jquery-1.1...
    99+
    2024-04-02
  • vue3中的对象时为proxy对象如何获取值(两种方式)
    目录第一种获取target值的方式:第二种获取target值PS:vue3中获取proxy包裹的数据前言一、具体问题二、解决办法使用vue3.0时,因为底层是使用proxy进行代理的...
    99+
    2023-01-28
    vue3 proxy对象获取值 vue3中获取proxy包裹的数据 vue3获取target值
  • 从函数返回时无法接收正确的对象
    来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《从函数返回时无法接收正确的对象》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!...
    99+
    2024-04-05
  • JVM中判定对象需要回收的方法
    引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收 这个可以用数据算法中的图形表示...
    99+
    2024-04-02
  • php怎么获取对象的所有方法名
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑在php中,可以使用get_class_methods()函数来获取对象的所有方法名。get_class_methods()函数可获取指定类(对象)的所有方法名,并且组...
    99+
    2019-11-13
    php 对象方法 方法名
  • python获取和修改对象属性的方法
    这篇文章给大家分享的是有关python获取和修改对象属性的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow...
    99+
    2023-06-14
  • php如何获取对象的所有方法名
    这篇“php如何获取对象的所有方法名”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何获取对象的所有方法名”文章吧。在...
    99+
    2023-06-29
  • python动态获取对象的属性和方法
    原文链接:http://blog.csdn.net/kenkywu/article/details/6822220首先通过一个例子来看一下本文中可能用到的对象和相关概念。01     #coding: UTF-802     import ...
    99+
    2023-01-31
    属性 对象 方法
  • 使用js获取url中的参数并返回一个对象方式
    目录js获取url中的参数并返回一个对象思路js解析url中的参数——返回对象需求代码一点思路总结js获取url中的参数并返回一个对象 今天写一个原生的htm...
    99+
    2023-01-17
    js获取url的参数 js返回对象 js获取参数
  • Spring中获取Bean对象的注入方式有哪些
    本篇内容主要讲解“Spring中获取Bean对象的注入方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中获取Bean对象的注入方式有哪些”吧!前言获取 bean 对象也叫做对...
    99+
    2023-07-05
  • Android开发之获取LayoutInflater对象的方法总结
    本文实例讲述了Android开发之获取LayoutInflater对象的方法。分享给大家供大家参考,具体如下: 在写Android程序时,有时候会编写自定义的View,使用In...
    99+
    2022-06-06
    方法 layoutinflater android开发 Android
  • JavaScript获取对象key的几种方法和区别
    目录1、Object.keys()遍历自身可以枚举属性2、Ojbect.values() /Ojject.entries()3、for-in 遍历可枚举属性prototype 属性4...
    99+
    2024-04-02
  • JVM中判定对象需要回收的方法是什么
    本文小编为大家详细介绍“JVM中判定对象需要回收的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“JVM中判定对象需要回收的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。引用计数法每个对象上都...
    99+
    2023-06-30
  • php怎么获取一个对象中所有的方法
    在PHP中,获取一个对象中所有的方法非常简单,可以利用PHP标准库中的 ReflectionClass 类实现。ReflectionClass 类提供了在PHP中反射一个类的所有信息的方法,包括类名、属性和方法等。下面我们详细介绍如何使用 ...
    99+
    2023-05-14
    php php对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作