-
说一下 TCP 半包和粘包问题?
说一下 TCP 半包和粘包问题?回答重点因为TCP 协议是面向字节流的,数据在传输过程中没有明确的边界,所以会发生粘包和半包问题。 1)粘包问题: 粘包指的是多个应用层的数据包在传输过程中被合并成一个 TCP 数据包,导致接收方无法区分各个独立的数据包。 2)半包问题: 半包指的是一个应用层的数据包在传输过程中被拆分成多个 TCP 数据包,接收方需要多次读取才能获取完整的数据。 常见解决粘包... -
Netty 是如何解决粘包和拆包问题的?
Netty 是如何解决粘包和拆包问题的?回答重点Netty 提供了丰富的自带解码器为我们解决粘包和拆包的问题,也可以让我们自定义序列化解码器。 Netty 自带的解码器 DelimiterBasedFrameDecoder:分隔符解码器,使用特定分隔符来分割消息。 FixedLengthFrameDecoder:固定长度的解码器,可以按照指定长度对消息进行拆包,如果长度不够的话,可以使用空格... -
Netty 性能为什么这么高?
Netty 性能为什么这么高?回答重点Netty 性能高的主要原因如下: 非阻塞 I/O 模型:Netty 底层使用了 NIO 非阻塞模型,并且利用I/O 多路复用,通过 Selector 监听多个 Channel 的 IO 事件,使得系统资源得到了充分利用,减少了线程开销。 高效的内存操作与内存池设计:ByteBuf 提供了丰富的功能,如动态扩展、复合缓冲区等,能高效... -
Netty 如何解决 JDK NIO 中的空轮询 Bug?
Netty 如何解决 JDK NIO 中的空轮询 Bug?回答重点Netty 实际上并没有解决 JDK 原生 NIO 中空轮询 bug,而是通过其他途径绕开了这个错误。 具体操作如下: 1)统计空轮询次数:Netty 通过 selectCnt 计数器来统计连续空轮询的次数。每次执行 Selector.select() 方法后,如果发现没有 I/O 事件,selectCnt 就会递增... -
Netty 采用了哪些设计模式?
Netty 采用了哪些设计模式?回答重点Netty 作为许多中间件的底层网络通讯框架,内部设计使用了很多的设计模式: 1)策略模式 例如,Netty 提供了多种 EventLoopGroup 实现(如 NioEventLoopGroup、EpollEventLoopGroup),可以根据不同的操作系统和需求选择不同的实现。 2)单例模式 我们在面试鸭设计模式题库中提到池化设计经常就需要用到单... -
让你设计一个文件上传系统,怎么设计?
让你设计一个文件上传系统,怎么设计?这种题目都是开放性的,面试过程中也不奢望聊出所有的设计细节,仅仅需要抛出一些大致的设计需求与要点,然后简单的方案实现思路即可。 关于文件上传系统有几个最主要的核心点需要解决: 1)如何支持超大文件上传2)避免重复文件存储,节省空间3)限流问题 大文件上传假设有个 10 G 的文件需要上传,正常情况下是将文件转成流传到后端,如果不做任何处理,前端一直传,后端... -
在 Netty 中,什么是 Channel ? 什么是 ChannelHandlerContext?
在 Netty 中,什么是 Channel ? 什么是 ChannelHandlerContext?回答重点在 Netty 中,Channel 表示一个网络连接,抽象了底层的网络操作,提供绑定、连接、读写和关闭等操作,是网络 I/O 操作的核心抽象。 ChannelHandlerContext 是 Netty 中用来在 ChannelPipeline 中传递数据和处理事件的上下文对... -
让你设计一个分布式 ID 发号器,怎么设计?
让你设计一个分布式 ID 发号器,怎么设计?一般在分库分表场景,就会有分布式 ID 的需求,因为需要有一个唯一标识来标记一个订单或者其他类似的数据等。 全局唯一 ID 有很多种实现,例如 UUID ,优势就是本地生成,很简单。但它是无序的,如果需要将唯一 ID 作为主键,则 UUID 不合适,首先是太长了,其次无序插入会导致数据页频繁分裂,性能不好。 在回答这个面试题的时候可以先提下 UUI... -
如何设计一个点赞系统?
如何设计一个点赞系统?点赞系统看似简单,实则非常复杂,它可以从系统架构、库表设计、数据存储、性能优化、容灾备份等多个角度来思考设计。 我们可以由浅入深的向面试官来说出这个实现方案: 系统架构设计从架构方面需要考虑:服务拆分、异步、缓存。 1)分布式架构 大流量场景下,可以将点赞功能独立成一个服务,解耦业务逻辑,便于扩展和维护。例如点赞服务压力倍增的时候,可以仅扩容点赞服务即可。 2)异步处理... -
如何设计一个秒杀功能?
如何设计一个秒杀功能?回答重点 面试官针对这个问题不指望候选人可以系统地回答出完且可落地的方案。只是想考察候选人是否拥有高并发大流量场景下的处理思路或者说能考虑到的一些关键点。 针对秒杀场景,我们需要先和面试官说出以下几个需要解决的问题点: 瞬时流量的承接 防止超卖 预防黑产 避免对正常服务的影响 兜底方案 然后可以从前后端两个视角向面试官阐述整体的设计点: 首先是前端: 利用 C... -
让你设计一个线程池,怎么设计?
让你设计一个线程池,怎么设计?这种设计类问题还是一样,先说下理解,表明你是知道这个东西的用处和原理的,然后开始 阐述。 基本上就是按照现有的设计来说,再添加一些个人见解。 线程池讲白了就是存储线程的一个容器,池内保存之前建立过的线程来重复执行任务,减少创建和销毁线程的开销,提高任务的响应速度,并便于线程的管理。 我个人觉得如果要设计一个线程池的话得考虑池内工作线程的管理、任务编排执行、线程池... -
让你设计一个 HashMap ,怎么设计?
让你设计一个 HashMap ,怎么设计?这个问题我觉得可以从 HashMap 的一些关键点入手,例如 hash函数、如何处理冲突、如何扩容。 可以先说下你对 HashMap 的理解。 比如:HashMap 无非就是一个存储 <key,value> 格式的集合,用于通过 key 就能快速查找到 value。 基本原理就是将 key 经过 hash 函数进行散列得到散列值,然后通过... -
即时通讯项目中怎么实现历史消息的下拉分页加载?
即时通讯项目中怎么实现历史消息的下拉分页加载?业务场景一般在即时通讯项目(比如聊天室)中,我们会采用下拉分页的方式让用户加载历史消息记录。 区别于标准分页每次只展示当前页面的数据,下拉分页加载是 增量加载 的模式,每次下拉时会请求加载一小部分新数据,并放到已加载的数据列表中,从而形成无限滚动的效果,确保用户体验流畅。 比如用户有 10 条消息记录,以 5 条为单位进行分页,刚进入房间时只会加... -
Java 的 synchronized 是怎么实现的?
Java 的 synchronized 是怎么实现的?回答重点synchronized 实现原理依赖于 JVM 的 Monitor(监视器锁) 和 对象头(Object Header)。 当 synchronized 修饰在方法或代码块上时,会对特定的对象或类加锁,从而确保同一时刻只有一个线程能执行加锁的代码块。 synchronized 修饰方法:会在方法的访问标志中增加一个 ACC_S... -
为什么 Netty 不使用 ThreadLocal 而是自定义了一个 FastThreadLocal ?
为什么 Netty 不使用 ThreadLocal 而是自定义了一个 FastThreadLocal ?我们先来思考下 ThreadLocal 有哪些不够好的地方,如果要改都需要改哪些实现。 ThreadLocal hash 冲突的线性探测法不好,还有 Entry 的弱引用可能会发生内存泄漏,这些都和 ThreadLocalMap 有关,所以需要搞个新的 map 来替换 ThreadLoca... -
什么是限流?限流算法有哪些?怎么实现的?
什么是限流?限流算法有哪些?怎么实现的?限流是什么?首先来解释下什么是限流? 在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。 那在我们工程上限流是什么呢?限制的是 「流」,在不同场景下「流」的定义不同,可以是每秒请求数、每秒事务处理数、网络流量等等。 而通常我们说的限流指代的是 限制到达系统的并发请求数,使得... -
稻盛和夫:赚钱最快的四条路,从未改变
稻盛和夫说: “赚钱最快的四条路。从未改变。 第一、信息差,即我知道的,你不知道。 第二、认知差,即指我懂的,你不懂。 第三、执行差,即你我都懂,但你不做我做。 第四、竞争差,即你我都懂,你我都做,但我做得比你好。” 稻盛和夫所述的四种赚钱之路,实则是人生进阶的四种智慧。这不仅仅是关于财富的积累,更是关于心灵的升华和智慧的沉淀。 “信息差,即我知道的,你不知道。”这便是第一条道路。 世间万物... -
赚钱,无非这5种途径:信息差、认知差、执行差、竞争差、资源差
要想赚钱,就一定要找到搞钱的路子。如果路子都选择不正确,那你注定是穷人。赚钱,无非以下这5大途径,就看你能领悟哪一条。 一:靠信息差赚钱信息差,简单来说,就是你知道的别人不知道,你会的东西别人不会,你掌握的信息别人还在搜索。这种观点可能会让人感到不舒服,觉得利用他人的无知来赚钱不道德。但让我们暂时抛开道德判断,从客观的角度来看这个现象。在现实生活中,信息差无处不在:当你去餐厅吃饭时,厨师知... -
6.有关float精度问题
先来引入一个问题
1
System.err.println(9990000110F<=9990000000F);
运行结果是: true
然后你的问题就来了,这个是谁大呢?
-
关于我
联系方式 手机: Email: 微信: 个人信息 魏先生/男/1990年 本科/计算机科学与技术 技术博客:http://blog.weiyuanbiao.cn/ 荣誉奖励:获得了什么奖(获奖时间) Github:https://github.com/Snailclimb Github Resume: http://resume.github.io/... -
tags
国学 -
ThreadLocal原理
ThreadLocal
ThreadLocal简介
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的
ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个
ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使用get()和set()方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。 -
12.字节码的初步认识,来自i=i++,i=++i原理分析
首先来代码:
1
2
3
4
5
6
7public class TestPlusPlus {
public static void main(String[] args) {
int i = 0;
i++;
System.err.println(i);
}
}然后执行 javap -c TestPlusPlus
-
11.mybatis原理分析
mybatis运行流程sql封装流程结果集绑定方式注意问题 -
10.二叉树.B+树.红黑树等各种树
树的简介二叉树B树B+树红黑树