首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Netty技术知识点总结

EventLoop 是一个事件循环线程,它通过 Java NIO 的 selector 管理多个 Channel。...EventExecutor:可以执行的线程; EventExecutorGroup:线程组,用于管理和分配多个 EventExecutor; 在 ChannelPipeline 添加 ChannelHandler...它针对 ByteBuffer 类的缺点进行了优化,分为了读写两部分,可以在任意位置读取数据,开发者只需要调整数据索引位置,以及再次开始读操作即可。...所以 ByteBuf 本质就是一个由不同的索引分别控制读访问和写访问的字节数组。ByteBuf 的数据结构如下所示: ?...容器里面的的数据分为三个部分: 已经丢弃的字节:这部分数据是无效的; 可读字节:这部分数据是 ByteBuf 的主体数据, 从 ByteBuf 里面读取的数据都来自这一部分; 可读字节之前的指针即为读指针

91011

Java知识面试题复习(四)Java常用API

但是很多初学者却容易忽视,Java 的 8 种基本数据类型中不包括 String,基本数据类型中用来描述文本数据的是 char,但是它只能表示单个字符,比如 ‘a’,‘好’ 之类的,如果要描述一段文本,就需要用多个...System.out.println(str2 == "hello"); //false str2 = str1; System.out.println(str2 == "hello"); //true 如何将字符串反转...线程安全性 String中的对象是不可变的,也就可以理解为常量,线程安全。...StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。...Date相关 包装类相关 自动装箱与箱 装箱:将基本类型用它们对应的引用类型包装起来; 箱:将包装类型转换为基本数据类型; int 和 Integer 有什么区别 Java 是一个近乎纯洁的面向对象编程语言

55550
您找到你想要的搜索结果了吗?
是的
没有找到

JAVA知识点总结篇(三)

接口使用:一个类可以实现一个或多个接口,实现接口使用implements关键字。Java中一个类只能继承一个父类,可以通过多个接口做补充; ?...,而StringBuilder则没有实现线程安全功能,所以性能更高; 包装类 基本类型和包装类之间的对应关系: ?...包装类提供的两大类 将本类型和其他基本类型进行转换的方法; 将字符串和本类型及包装类互相装换的方法; 装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱; 箱:把包装类对象转换程基本类型的值...,分为手动箱和自动箱; 基本类型转换为字符串的三种方法: 使用包装类的toString()方法; 使用String类的valueof()方法; 用一个空字符串加上基本类型,得到的就是基本数据类型对应的字符串...数组长度固定,集合长度可变; 数组只能通过下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象; ?

1K20

Java 知识点总结篇(3)

由全局常量和公共的抽象方法所组成; 类是一种具体实现体,而接口定义了某一批类所要遵守的规范,接口不关心这些类的内部数据,也不关心这些类中方法的实现细节,它只规定这些类中必须提供某些方法; 接口使用:一个类可以实现一个或多个接口...Java中一个类只能继承一个父类,可以通过多个接口做补充; UML 定义:统一建模语言或标准建模语言,是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持; 异常...==和equals()的区别 ==判断两个字符串在内存中首地址是否相同,即判断是否同一个字符串对象; equals:比较存储在两个字符串对象中的内容是否一致; StringBuffer是线程安全的...; 装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱; 箱:把包装类对象转换程基本类型的值,分为手动箱和自动箱; 基本类型转换为字符串的三种方法: 使用包装类的...数组长度固定,集合长度可变; 数组只能通过下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象; Collection接口 是List、Set、Queue接口的父接口

95530

小时到分钟 - 一步步优化巨量关键词的匹配

本文完整介绍了我的实现方式,看我如何将需要运行十小时的任务优化到十分钟以内。虽然实现语言是 PHP,但本文介绍的更多的思想,应该能给大家一些帮助。...可是一条短消息,我如何把它拆分为刚好的词去匹配呢,分词?分词也是需要时间的,而且我的关键词都是些无语义的词,构建词库、使用分词工具又是很大的问题,最终我想到 词。...为什么叫词呢,我考虑以蛮力将一句话拆分为所有可能的词。如我是好人就可以拆成 我是、是好、好人、我是好、是好人、我是好人等词,我的关键词长度为 2-8,所以可词个数会随着句子长度迅速增加。...PHP 是单线程的(虽然也有不好用的多线程扩展),这没啥好的解决办法,并发方向只好从多进程进行了。 那么一个日志文件,用多个进程怎么读呢?...使用 linux 的 split -l n file.log output_pre 命令,将文件分割为每份为 n 行的文件,然后用多个进程去读取多个文件。

1.7K60

JAVA面试50讲之4:int和Integer的区别

3.理解自动装箱和箱 3.1 什么是装箱?什么是箱? 装箱就是 自动将基本数据类型转换为包装器类型;箱就是 自动将包装器类型转换为基本数据类型。...value使用了volatile关键字,使得多个线程可以共享变量,使用volatile将使得VM优化失去作用,在线程数特别大时,效率会较低。...5.2 无法高效地表达数据,也不便于表达复杂的数据结构 Java 的对象都是引用类型,如果是一个原始数据类型数组,它在内存里是一段连续的内存,而对象数组则不然,数据存储的是引用,对象往往是分散地存储在堆的不同位置...6.关于其他知识延伸 6.1 对象的内存结构 对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。...另外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是从数组的元数据中却无法确定数组的大小。

95420

Netty与TCP粘包

TCP底层并不了解上层业务数据的具体意义,他会根据TCP缓冲区的实际情况进行包的划分,所以在业务上一个完整的包,有可能会被TCP拆分为多个包进行发送,也有可能把业务上多个小包封装成一个大的数据包发送,这就是所谓的...TCP粘包和包问题。...粘包包说明 现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下: 第一种情况,接收端正常收到两个数据包,即没有发生包和粘包的现象...NIO线程组 //NioEventLoopGroup是个线程组,包含了一组NIO线程,处理网络事件,实际上就是Reactor线程组 try (EventLoopGroup...//NioEventLoopGroup是个线程组,包含了一组NIO线程,处理网络事件,实际上就是Reactor线程组 try (EventLoopGroup bossLoopGroup

94740

跟着源码学IM(八):万字长文,手把手教你用Netty打造IM聊天

空,作为标记接口 } 5.2、粘包与包 在开始看 Invocation 的编解码处理器之前,我们先了解下粘包与包的概念。...如果一次请求发送的数据量比较小,没达到缓冲区大小,TCP 则会将多个请求合并为同一个请求进行发送,这就形成了粘包问题。...如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP 就会将其拆分为多次发送,这就是包,也就是将一个大的包拆分为多个小包进行发送。... 处,将字节数组的长度,写入到 TCP Socket 当中。这样,后续「5.4 InvocationDecoder」可以根据该长度,解析到消息,解决粘包和包的问题。...并且,多个 Channel 会共享一个线程,即使用同一个线程进行数据的读写。 那么试着思考下,MessageHandler 的具体逻辑视线中,往往会涉及到 IO 处理,例如说进行数据库的读取。

1.4K41

Netty相关知识汇总

Reactor线程模型 Reactor单线程模型 一个NIO线程+一个accept线程: Reactor多线程模型 Reactor主从模型 主从Reactor多线程多个acceptor的NIO线程池用于接受客户端的连接...,然后将两个数组中的数据拷贝到新的数组中。...netty通常被用于高并发系统,多线程竞争加锁会影响内存分配的效率,为了缓解高并发时的线程竞争,netty允许使用者创建多个分配器(PoolArena)来分离线程竞争,提高内存分配效率。...线程申请内存分配时,线程会在这个PoolArena数组中挑选一个当前被占用次数最少的Arena执行内存分配。...,FastThreadLocalThread用一个数组来维护线程变量,每个FastThreadLocal维护一个index,该index就是线程局部变量在数组中的位置,线程变量直接通过index访问无需计算

92220

Java核心技术讲解六

在Java9中引入了一种新的设计,将其底层改为byte数组,数据存储方式改为了byte数组加上一个标识编码。...该方法是一个线程安全的可修改字符序列,保证了线程安全,这样就会带来额外消耗,所以我们在多线程时可以使用该类进行操作 ,建议使用StringBuffer,例如XML解析、HTTP参数解析与封装。。...自动装箱和自动箱 在笔者原先做web开发的时候并没有注意对int类型还有Integer类型特别的注意,因为在这里面笔者并没有注意自动装箱和自动箱的作用,在这次大数据进行开发的时候,因为我们内存的原因并且处理量太大...,不容易处理,java中自动箱和自动装箱让笔者才注意到。...解决方案建议用原始数据类型,,数组或者本地代码来实现替换。 对象头在对象中究竟占用了多少呢? 对象分为 对象头,对象实例,对其填充。我们这次先说下这个分类。

53120

任务拆分计算利器 ForkJoin 框架玩法详解

一、摘要 从 JDK 1.7 开始,引入了一种新的 Fork/Join 线程池框架,它可以把一个大任务拆成多个小任务并行执行,最后汇总执行结果。...如果拆分之后的部分还是很大,可以继续,直到满足最小颗粒度,再进行计算,这个过程可以反复“裂变”成一系列小任务,这个就是 Fork/Join 的工作原理。...sum += this.array[i]; } return sum; } // 任务太大,一分为二...同时,它还包括两个主要方法:fork()和join(),分别表示任务的分与合并。 可以使用下图来表示这个过程。...通过ForkJoinPool和ForkJoinTask搭配使用,将超大计算任务拆分成多个互不干扰的小任务,提交给线程池进行计算,最后将各个任务计算结果进行汇总处理,得到跟单线程执行一致的结果,当计算任务越大

13810

跟着源码学IM(八):万字长文,手把手教你用Netty打造IM聊天

空,作为标记接口 } 5.2、粘包与包 在开始看 Invocation 的编解码处理器之前,我们先了解下粘包与包的概念。...如果一次请求发送的数据量比较大,超过了缓冲区大小,TCP 就会将其拆分为多次发送,这就是包,也就是将一个大的包拆分为多个小包进行发送。...如下图展示了粘包和包的一个示意图,演示了粘包和包的三种情况: ?... 处,将字节数组的长度,写入到 TCP Socket 当中。这样,后续「5.4 InvocationDecoder」可以根据该长度,解析到消息,解决粘包和包的问题。...并且,多个 Channel 会共享一个线程,即使用同一个线程进行数据的读写。 那么试着思考下,MessageHandler 的具体逻辑视线中,往往会涉及到 IO 处理,例如说进行数据库的读取。

1.6K10

Java基础八股文第一弹

整个五子棋可以分为: 黑白双方 棋盘系统,负责绘制画面 规则系统,负责判定诸如犯规、输赢等。...箱:将包装类型转化为基础类型。...当基础类型与它们的包装类有如下几种情况时,编译器会自动帮我们进行装箱或箱: 赋值操作(装箱或箱) 进行加减乘除混合运算 (箱) 进行>、<、==比较运算(箱) 调用equals进行比较(装箱)...线程安全。同一个字符串实例可以被多个线程共享,因为字符串不可变,本身就是线程安全的。 支持hash映射和缓存。...split():分割字符串,返回一个分割后的字符串数组。 getBytes():返回字符串的 byte 类型数组。 length():返回字符串长度。

94310

分布式系统的概念都搞懂了吗?(上)

- 并发 - 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时...如果一个锁守护多个相互独立的状态变量,你可能能够通过分锁,使每一个锁守护不同的变量,从而改进可伸缩性。通过这样的改变,使每一个锁被请求的频率都变小了。...分锁对于中等竞争强度的锁,能够有效地把它们大部分转化为非竞争的锁,使性能和可伸缩性都得到提高。分锁有时候可以被扩展,分成若干加锁块的集合,并且它们归属于相互独立的对象,这样的情况就是分离锁。...例如: ConcurrentHashMap的实现使用了一个包含16个锁的数组,每一个锁都守护HashMap的1/16。假设Hash值均匀分布,这将会把对于锁的请求减少到约为原来的1/16。...和并发的区别:并发和并行是即相似又有区别的两个概念,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。

49410

一文带你了解Netty

多个acceptor的NIO线程池用于接受客户端的连接 Netty可以基于如上三种模型进行灵活的配置。...一种是多个字符串“粘”在了一起,我们定义这种 ByteBuf 为粘包。 一种是一个字符串被“”开,形成一个破碎的包,我们定义这种 ByteBuf 为半包。...而在Netty中,已经造好了许多类型的包器,我们直接用就好: 选好包器后,在代码中client段和server端将包器加入到chanelPipeline之中就好了: 如上实例中: 客户端: 服务端...,然后将两个数组中的数据拷贝到新的数组中。...但是使用Netty提供的组合ByteBuf,就可以避免这样的操作,因为CompositeByteBuf并没有真正将多个Buffer组合起来,而是保存了它们的引用,从而避免了数据的拷贝,实现了零拷贝。

32900

学习笔记:java并发编程学习之初识Concurrent

CompletionService : ExecutorService的扩展,可以获得线程执行结果的 CountDownLatch :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待...其内部结构可以划分为N个段,每个段都有自己的并发锁,这样写入时可以写入不同的段中,从而提高了并发的性能。...分锁(lock spliting)就是若原先的程序中多处逻辑都采用同一个锁,但各个逻辑之间又相互独立,就可以(Spliting)为使用多个锁,每个锁守护不同的逻辑。...分锁有时候可以被扩展,分成可大可小加锁块的集合,并且它们归属于相互独立的对象,这样的情况就是分离锁(lock striping)。...例如,ConcurrentHashMap 的实现使用了一个包含 16 个锁的数组,每一个锁都守护 HashMap 的 1/16 。

632100

Netty 入门详解

多个acceptor的NIO线程池用于接受客户端的连接 Netty可以基于如上三种模型进行灵活的配置。...一种是多个字符串“粘”在了一起,我们定义这种 ByteBuf 为粘包。 一种是一个字符串被“”开,形成一个破碎的包,我们定义这种 ByteBuf 为半包。...而在Netty中,已经造好了许多类型的包器,我们直接用就好: 选好包器后,在代码中client段和server端将包器加入到chanelPipeline之中就好了: 如上实例中: 客户端: 服务端...,然后将两个数组中的数据拷贝到新的数组中。...但是使用Netty提供的组合ByteBuf,就可以避免这样的操作,因为CompositeByteBuf并没有真正将多个Buffer组合起来,而是保存了它们的引用,从而避免了数据的拷贝,实现了零拷贝。

99175

Netty权威指南_算法笔记上机指南pdf

Unix I/O模型分为5类: ①阻塞IO模型 文件操作的默认模型。...当需要同时处理多个客户端接入请求时,可以利用多线程或IO多路复用技术实现。...IO多路复用:通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下也可以同时处理多个客户端请求。 IO多路复用最大优势:系统开销小。...粘包:上层业务的多个小包被封装成一个大的数据包发送。 包:上层业务的一个完整的包被拆分成多个数据包发送。 3.2 TCP粘包/包解决方案 主要有四种解决方案: ①消息定长。...③将消息分为消息头和消息体,消息头中包含表示消息总长度的字段。 ④更复杂的应用层协议。 为了解决TCP粘包/包导致的半包读写问题,Netty默认提供了多种编解码器用于处理半包。

1.3K40
领券