Jdk注释翻译

/**
*返回ByteBuf的可读字节的拷贝。修改返回的ByteBuf内容与当前ByteBuf完全不会相互影响。
*此方法不会修改当前ByteBuf的readerIndex或writerIndex
**/
public abstract ByteBuf copy();
/**
*返回ByteBuf可读字节的一部分。 修改返回的ByteBuf或当前ByteBuf会影响彼此的内容,
*同时它们维护单独的索引和标记,此方法不会修改当前ByteBuf的readerIndex或writerIndex
*另请注意,此方法不会调用{@link #retain()},因此不会增加引用计数。
**/
public abstract ByteBuf duplicate();
/**
*返回共享当前ByteBuf信息的新ByteBuf,他们使用独立的readIndex writeIndex markIndex
*修改返回的ByteBuf或当前ByteBuf会影响彼此的内容,同时它们维护单独的索引和标记,
*此方法不会修改当前ByteBuf的readerIndex或writerIndex,
*另请注意,此方法不会调用{@link #retain()},因此不会增加引用计数
**/
public abstract ByteBuf slice();

实验验证

public class ByteBufTest {public static void main(String[] args) throws UnsupportedEncodingException {ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(10);byteBuf.writeInt(126);byteBuf.writeInt(127);byteBuf.writeBytes(new byte[]{1});System.out.println("byteBuf readInt="+byteBuf.readInt());System.out.println("byteBuf readerIndex=" + byteBuf.readerIndex() + "| writeIndex=" + byteBuf.writerIndex() + "|capacity=" + byteBuf.capacity());//返回ByteBuf的可读字节的拷贝。修改返回的ByteBuf内容与当前ByteBuf完全不会相互影响。//此方法不会修改当前ByteBuf的readerIndex或writerIndexSystem.out.println("====================byteBuf.copy()==================");ByteBuf cByteBuf = byteBuf.copy();System.out.println("cByteBuf readerIndex=" + cByteBuf.readerIndex() + "| writeIndex=" + cByteBuf.writerIndex() + "|capacity=" + cByteBuf.capacity());System.out.println("byteBuf readerIndex=" + byteBuf.readerIndex() + "| writeIndex=" + byteBuf.writerIndex() + "|capacity=" + byteBuf.capacity());System.out.println("向cByteBuf中写入数据" + cByteBuf.setInt(0, 128));System.out.println("cByteBuf=" + cByteBuf.getInt(0) + "|cByteBuf=" + cByteBuf.getByte(4));System.out.println("byteBuf=" + byteBuf.getInt(0) + "|byteBuf=" + byteBuf.getInt(4) + "|byteBuf=" + byteBuf.getByte(8));//返回ByteBuf可读字节的一部分。 修改返回的ByteBuf或当前ByteBuf会影响彼此的内容,// 同时它们维护单独的索引和标记,此方法不会修改当前ByteBuf的readerIndex或writerIndex//另请注意,此方法不会调用{@link #retain()},因此不会增加引用计数。System.out.println("====================byteBuf.slice()==================");ByteBuf sByteBuf = byteBuf.slice();System.out.println("sByteBuf readerIndex=" + sByteBuf.readerIndex() + "| writeIndex=" + sByteBuf.writerIndex() + "|capacity=" + sByteBuf.capacity());System.out.println("byteBuf readerIndex=" + byteBuf.readerIndex() + "| writeIndex=" + byteBuf.writerIndex() + "|capacity=" + byteBuf.capacity());System.out.println("向sByteBuf中写入数据" + sByteBuf.setInt(0, 128));System.out.println("sByteBuf=" + sByteBuf.getInt(0) + "|sByteBuf=" + sByteBuf.getByte(4));System.out.println("byteBuf=" + byteBuf.getInt(0) + "|byteBuf=" + byteBuf.getInt(4) + "|byteBuf=" + byteBuf.getByte(8));//返回共享当前ByteBuf信息的新ByteBuf,他们使用独立的readIndex writeIndex markIndex//修改返回的ByteBuf或当前ByteBuf会影响彼此的内容,同时它们维护单独的索引和标记,// 此方法不会修改当前ByteBuf的readerIndex或writerIndex,//另请注意,此方法不会调用{@link #retain()},因此不会增加引用计数。System.out.println("====================byteBuf.duplicate()==================");ByteBuf dByteBuf = byteBuf.duplicate();System.out.println("dByteBuf readerIndex=" + dByteBuf.readerIndex() + "| writeIndex=" + dByteBuf.writerIndex() + "|capacity=" + dByteBuf.capacity());System.out.println("byteBuf readerIndex=" + byteBuf.readerIndex() + "| writeIndex=" + byteBuf.writerIndex() + "|capacity=" + byteBuf.capacity());System.out.println("向dByteBuf中写入数据" + dByteBuf.setInt(0, 100));System.out.println("dByteBuf=" + dByteBuf.getInt(0) + "|dByteBuf=" + dByteBuf.getInt(4) + "|dByteBuf=" + dByteBuf.getByte(8));System.out.println("byteBuf=" + byteBuf.getInt(0) + "|byteBuf=" + byteBuf.getInt(4) + "|byteBuf=" + byteBuf.getByte(8));dByteBuf.writeBytes(new byte[]{2});System.out.println("dByteBuf readerIndex=" + dByteBuf.readerIndex() + "| writeIndex=" + dByteBuf.writerIndex() + "|capacity=" + dByteBuf.capacity());System.out.println("byteBuf readerIndex=" + byteBuf.readerIndex() + "| writeIndex=" + byteBuf.writerIndex() + "|capacity=" + byteBuf.capacity());System.out.println("dByteBuf=" + dByteBuf.getInt(0) + "|dByteBuf=" + dByteBuf.getInt(4) + "|dByteBuf=" + dByteBuf.getByte(8) + "|dByteBuf=" + dByteBuf.getByte(9));System.out.println("byteBuf=" + byteBuf.getInt(0) + "|byteBuf=" + byteBuf.getInt(4) + "|byteBuf=" + byteBuf.getByte(8) + "|byteBuf=" + dByteBuf.getByte(9));}}

执行结果:

byteBuf readInt=126
byteBuf readerIndex=4| writeIndex=9|capacity=10
====================byteBuf.copy()==================
cByteBuf readerIndex=0| writeIndex=5|capacity=5
byteBuf readerIndex=4| writeIndex=9|capacity=10
向cByteBuf中写入数据PooledUnsafeDirectByteBuf(ridx: 0, widx: 5, cap: 5)
cByteBuf=128|cByteBuf=1
byteBuf=126|byteBuf=127|byteBuf=1
====================byteBuf.slice()==================
sByteBuf readerIndex=0| writeIndex=5|capacity=5
byteBuf readerIndex=4| writeIndex=9|capacity=10
向sByteBuf中写入数据UnpooledSlicedByteBuf(ridx: 0, widx: 5, cap: 5/5, unwrapped: PooledUnsafeDirectByteBuf(ridx: 4, widx: 9, cap: 10))
sByteBuf=128|sByteBuf=1
byteBuf=126|byteBuf=128|byteBuf=1
====================byteBuf.duplicate()==================
dByteBuf readerIndex=4| writeIndex=9|capacity=10
byteBuf readerIndex=4| writeIndex=9|capacity=10
向dByteBuf中写入数据UnpooledDuplicatedByteBuf(ridx: 4, widx: 9, cap: 10, unwrapped: PooledUnsafeDirectByteBuf(ridx: 4, widx: 9, cap: 10))
dByteBuf=100|dByteBuf=128|dByteBuf=1
byteBuf=100|byteBuf=128|byteBuf=1
dByteBuf readerIndex=4| writeIndex=10|capacity=10
byteBuf readerIndex=4| writeIndex=9|capacity=10
dByteBuf=100|dByteBuf=128|dByteBuf=1|dByteBuf=2
byteBuf=100|byteBuf=128|byteBuf=1|byteBuf=2

小结:

  • duplicate():直接拷贝整个buffer,包括readerIndex、capacity、writerIndex
  • slice():拷贝buffer中已经写入数据的部分
  • copy()方法会进行内存复制工作,效率很低。

duplicate和copye这两个方法都属于浅拷贝它和原buffer是共享数据的。所以说调用这些方法消耗是很低的,
并没有开辟新的空间去存储,但是修改后会影响原buffer。这就会导致一个问题:在源ByteBuf调用release() 之后,
一旦引用计数为零,就变得不能访问了;在这种场景下,源ByteBuf的所有浅层复制实例也不能进行读写了;如果强行对浅层复制实例进行读写,则会报错。因此,在调用浅层复制实例时,可以通过调用一次retain() 方法来增加引用,表示它们对应的底层内存多了一次引用,引用计数为2。在浅层复制实例用完后,需要调用两次release()方法,将引用计数减一,这样就不影响源ByteBuf的内存释放。

Netty中ByteBuf的copy、duplicate、slice方法对比相关推荐

  1. Netty中ByteBuf 的零拷贝

    转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...

  2. 谈谈JS中的拷贝Copy复制的方法(Javascript拷贝)

    拷贝(Copy),都是基于引用类数据来说的,基本数据类型直接在Heap中直接拷贝一份,引用数据类型分为浅拷贝和深拷贝: 虽然现在有很多数据库,直接封装好了一部分代码,我们直接引用就可以,比如Lodas ...

  3. json转string示例_C.示例中的String.Copy()方法

    json转string示例 C#String.Copy()方法 (C# String.Copy() Method) String.Copy() method is used to copy a str ...

  4. Java求两集合中元素交集的四种方法对比总结

    hello,你好呀,我是灰小猿,一个超会写bug的程序猿! 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑 ...

  5. netty系列之:在netty中处理CORS

    文章目录 简介 服务端的CORS配置 CorsConfigBuilder CorsHandler netty对cors的支持 总结 简介 CORS的全称是跨域资源共享,他是一个基于HTTP-heade ...

  6. netty系列之:netty中的ByteBuf详解

    文章目录 简介 ByteBuf详解 创建一个Buff 随机访问Buff 序列读写 搜索 其他衍生buffer方法 和现有JDK类型的转换 总结 简介 netty中用于进行信息承载和交流的类叫做Byte ...

  7. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

    一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...

  8. jQuery中slice()方法用法实例

    本文实例讲述了jQuery中slice()方法用法.分享给大家供大家参考.具体分析如下: 此方法可以选取匹配元素集的子集. 语法结构: 复制代码 代码如下: $(selector).slice(sta ...

  9. array.slice_Ruby中带有示例的Array.slice()方法

    array.slice Array.slice()方法 (Array.slice() Method) In this article, we will study about Array.slice( ...

最新文章

  1. 30 岁码农人生:人生至暗时,你依然能窥见光明
  2. 成功解决object at 0x000002463192BAC8
  3. LVS DR模式搭建、keepalived+LVS
  4. 和男朋友一块儿吃VS单独一人在家吃饭
  5. php中函数的默认值,参数的顺序
  6. PAT甲级1022 map、set的使用
  7. WifiConfigManager NetworkSelector 和 WifiConnectivityManager
  8. 鲜为人知的合作:锐捷和juniper、联想和三茗
  9. 未来10年,软件开发技术的8个发展趋势
  10. 考研复试之路:不努力怎敢轻易言弃
  11. Springboot导出excel,合并单元格示例
  12. Python|每日一练|素数对|优化算法|素数|素数对:找出素数对
  13. 2012CSDN网站八大职位急聘:PHP开发工程师、Ruby开发工程师、UI设计师、网络工程师、问答社区编辑、问答社区运营专员、移动频道编辑、软件研发频道编辑
  14. java猜数字游戏代码_Java如何编写猜数字游戏
  15. linux下用chmod修改文件权限详解(文件权限与特殊权限)
  16. 最好用的10个php开发工具推荐
  17. 监控需求以及开源方案的对比
  18. 已成功与服务器建立连接,但是在登录过程中发生错误。(provider:TCP提供程序,error:0-指定的网络名不再可用。)(Microsoft SQL Server,错误:64)
  19. 换发型算法_GitHub - DylanMaeng/yry: yry(颜如玉)—— 一个实现人脸融合的算法,可以接近腾讯天天P图疯狂变脸功能的效果...
  20. [图像识别]10.OpenCV的特征点检测 SIFT和SURF算法

热门文章

  1. SSO搭建(框架KISSO)
  2. Ubuntu搭建BitCoin环境实验步骤及问题整理
  3. 高新技术企业申报需要注意的问题
  4. Mac 安装配置JDK14 并安装配置Intellij IDEA
  5. 正则表达式——非贪婪匹配
  6. CorelDRAW导出到office命令和CorelDRAW导出PNG透明图形介绍
  7. java后端面试大全,java后端面试宝典
  8. 12. 机器人的运动范围
  9. 荣耀 Magicbook16 Pro和联想小新Pro16参数对比选哪个好
  10. 【校内模拟】西行寺无余涅槃(FWT)