
多线程与IO
文章平均质量分 94
码炫课堂-码哥
一名有10余年经验的互联网老兵,历经从传统软件公司到大型互联网公司的洗礼,早年在中兴通讯等大型通信公司担任项目leader,后随着互联网的崛起,先后在前美团支付等大型互联网公司担任架构师。对互联网架构底层技术有相当的研究和独特的见解,在多个领域有着丰富的实战经验。
展开
-
【Java NIO】— 深入分析堆内内存 HeapByteBuffer
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-19 16:02:11 · 941 阅读 · 0 评论 -
【Java NIO】— 深入分析堆外内存 DirectByteBuffer & MappedByteBuffer
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-19 16:00:49 · 969 阅读 · 0 评论 -
【Java NIO】— 服务端多线程化
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-19 15:58:53 · 667 阅读 · 0 评论 -
【Java NIO】— 消息边界的处理
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-19 15:56:43 · 781 阅读 · 0 评论 -
【Java NIO】— Selector 源码分析
如果从 keys 数组中没有找到对应的 SelectionKey ,就需要调用方法来创建相对应的 SelectionKey。// 新建 SelectionKeyImpl 对象// 保存参数// 注册到 Selector// 加锁 publicKeys 后面再介绍// 关注操作return k;首先创建 SelectionKeyImpl 对象,该对象是 SelectionKey 的实现,然后调用。原创 2024-12-19 15:55:07 · 890 阅读 · 0 评论 -
【Java NIO】— 详解 Selector
在前一篇文章中码哥分析了 ServerSocketChannel 两种模式的缺点阻塞模式:所有阻塞方法都会引起线程的暂停,根本无法应用到业务中来非阻塞模式:CPU 一直在空转,浪费资源所以,如果是我们服务端单独使用 ServerSocketChannel 确实是很麻烦,典型的吃力不讨好。故而我们希望有一个组件能够统一管理我们的 Channel,这个组件就是选择器 Selector。原创 2024-12-19 08:07:08 · 993 阅读 · 0 评论 -
【Java NIO】— ServerSocketChannel 到底有哪些缺陷?
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-19 08:04:52 · 599 阅读 · 0 评论 -
【Java NIO】— 探索 SocketChannel 的核心原理
前两篇文章我们分析了 Channel 及 FileChannel,这篇文章我们探究 SocketChannel的核心原理,毕竟下一个系列就是 **【死磕 Netty】**了。要想掌握 SocketChannel,我们就必须先了解什么是 Socket。要想解释清楚 Socket,就需要了解下 TCP/IP。注:本文重点在 SocketChannel,所以对 TCP和 Socket仅仅只做相关介绍,有兴趣的同学,麻烦自查专业资料。学过计算机网络的小伙伴知道,计算机网络是分层的,每层专注于一类事情。OSI 网路模原创 2024-12-19 08:03:51 · 807 阅读 · 0 评论 -
【Java NIO】— 跨进程文件锁:FileLock
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-19 08:02:38 · 852 阅读 · 0 评论 -
【Java NIO】— 深入分析 Channel 和 FileChannel
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。大家好,我是码哥,这次我们来看看NIO的第二个组件:Channel。原创 2024-12-19 08:01:04 · 1136 阅读 · 0 评论 -
【Java NIO】— 深入分析 Buffer 核心原理
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。大家好,我是码哥,今天我们来看看 Buffer。原创 2024-12-19 07:59:08 · 713 阅读 · 0 评论 -
【Java NIO】— NIO 基础详解
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。原创 2024-12-18 08:09:26 · 678 阅读 · 0 评论 -
【Java NIO】— 聊聊 Proactor 模型
上篇文章码哥分析了 Reactor模式,我们知道Reactor性能确实非常高,适合高并发场景,但是它依然存在一个问题,那就是它是同步IO。同步IO会有一个什么问题呢?同步IO需要线程自己等待内核准备好数据,在内核准备数据的过程中,当前线程是阻塞的,这样就会导致如果某个线程因为读取IO的时间过长(比如读取文件、写文件),则它势必会影响其他线程的执行。既然同步IO有缺陷,那我们是不是可以调整为异步IO呢?完全可以,这就是Proactor 模式。原创 2024-12-18 08:07:51 · 721 阅读 · 0 评论 -
【Java NIO】— 深入分析 Reactor 模型核心原理
读请求(read request)读解析(read decode)处理程序(process service)应答编码 (encode reply)发送应答(send reply)接下来,码哥就来分析解决这个问题的最佳实践。单线程模式对于很多小伙伴来说,最简单,最传统的方式就是一个方法来处理所有的请求,这种实现方式最简单,也是最保险的方式。原创 2024-12-18 08:06:24 · 975 阅读 · 0 评论 -
【Java NIO】— 详解 5 种 IO 模型
什么是IO?维基百科上面是这样解释的:I/O(英语:Input/Output),即输入/输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。输入是系统接收的信号或数据,输出则是从其发送的信号或数据。这是IO一个完整的定义,不是特别好理解,要厘清IO这个概念,我们需要从如下两个视角来理解它。五种IO模型,层层递进,一个比一个性能高,当然模型的复杂度也一个比一个复杂。最后用一张图来总结下。原创 2024-12-18 08:04:16 · 987 阅读 · 0 评论 -
【Java NIO】— 阻塞、非阻塞、同步、异步
作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。万事从最基本的开始。原创 2024-12-18 08:02:13 · 718 阅读 · 0 评论 -
漫谈callback
今天,让我们一起来聊聊这些玩意。原创 2023-12-11 09:15:01 · 1057 阅读 · 0 评论 -
浅谈CompletableFuture
到这里,你可能懵逼了,那这个CompletionStage定义了那么多方法,到底是干啥用的?异步线程又为何会回调它传入的函数接口的方法呢,BiConsumer#accept()明明不是Runnable#run()、Callable#call()呀!原创 2023-12-11 09:11:05 · 2190 阅读 · 0 评论 -
管程模型与锁
学习多线程是为了提高任务执行效率,但多线程又引入了线程安全问题。所谓线程安全问题,可以简单地理解为数据不一致(与预期不一致)。什么时候可能出现线程安全问题呢?多线程环境有共享数据有多条语句操作共享数据/单条语句本身非原子操作(比如i++虽然是单条语句,但并非原子操作)比如线程A、B同时对int count进行+1操作(初始值假设为1),在一定的概率下两次操作最终结果可能为2,而不是3。那么加锁为什么能解决这个问题呢?原创 2023-12-10 09:43:56 · 1033 阅读 · 0 评论 -
设计山寨线程池
私以为造轮子几乎是最好的学习方式,甚至没有之一。不了解设计,就无法把握整体。没看过代码,就无法完善细节。另外,从创作者的角度来说,直接分析源码有时太困难了,代码太多,抽象层次太深。如果可以通过造轮子,把抽象层次减少一些,采用平铺直叙的方式呈现,那么读者理解起来也就更容易些。既然造轮子这么好,那就,拿来吧你。今天带大家造一个线程池。原创 2023-12-09 08:31:13 · 1040 阅读 · 0 评论 -
线程池继承体系
线程池的初衷是屏蔽线程的创建、使用及调度(复用)等细节,让使用者通过简单的提交即可执行任务。基于这个设计思想,JDK设计了一个顶级接口:Executor [ɪɡˈzekjətər] (念作:乙哥贼Q特)它只定义了一个方法:execute() [ˈeksɪkjuːt] (念作:爱克seeQ特)正如方法注释所说的,execute()作为接口方法,并没有强制子类如何实现。// 搞一个Executor实例// 提交任务即可,其他细节它帮你搞定(屏蔽底层细节,分离线程类和任务类)r.run();原创 2023-12-09 08:05:42 · 1532 阅读 · 0 评论 -
从线程间通信聊到阻塞队列
定义:针对同一个资源的操作有不同种类的线程。说人话就是:共享资源+多线程,最典型的例子就是锁和生产者消费者(关于锁,后面有专门的章节介绍,这里以生产者-消费者为例子讲解)。以现实生活为例。消费者和生产者就像两个线程,原本做着各自的事情,厂家管自己生产,消费者管自己买,一般情况下彼此互不影响。但当物资到达某个临界点时,就需要根据供需关系适当作出调整。当厂家做了一大堆东西,产能过剩时,应该暂停生产,扩大宣传,让消费者过来消费当消费者发现某个热销商品售罄,应该提醒厂家尽快生产。原创 2023-12-08 08:14:00 · 988 阅读 · 0 评论 -
FutureTask
为什么要介绍FutureTask呢?FutureTask为什么有意思呢?假设一个场景,要求设计一个方法,专门用来执行。这个需求的诡异之处在于:刚开始立即返回的result肯定不包含结果(毕竟耗时任务),但随后通过result.get()却又能得到结果!如果让我们从零开始实现这个需求,是比较困难的,好在JDK已经设计出FutureTask,它专门为这种场景而生。FutureTask就像个魔术盒,刚开始是空的,你抱着它走了几步,再打开时里面竟然出现了一个苹果,amazing!原创 2023-12-08 08:07:24 · 1016 阅读 · 0 评论 -
多线程基础
多线程向来是面试的重灾区,它真的很难。一般来说,普通的开发人员很少有机会能直接写多线程,一般都是使用封装好的工具类或者JDK提供的API,但并不意味着我们可以不用了解多线程。今天我们再来强化一下多线程的基础知识。原创 2023-12-07 09:02:52 · 939 阅读 · 0 评论 -
如何学习Java并发编程
2012年我刚转行到互联网,那年夏天我从传统通信行业跳槽到互联网行业。那是我成年后看的第一部国产动画片,可谓惊为天人。里面有所谓的八奇技,其中有一门绝技称为:术之尽头,炁体源流。虽然目前作者还没有揭开谜底,但从定义上来说,炁体源流大概有“追本溯源,回归本质”的含义。为什么扯这些呢?很多人学不好Java并发编程,恰恰是因为没有抓住本质。原创 2023-12-07 08:59:17 · 1363 阅读 · 0 评论