多线程与IO
文章平均质量分 94
smart哥
一名有10余年经验的互联网老兵,历经从传统软件公司到大型互联网公司的洗礼,早年在中兴通讯等大型通信公司担任项目leader,后随着互联网的崛起,先后在前美团支付等大型互联网公司担任架构师。对互联网架构底层技术有相当的研究和独特的见解,在多个领域有着丰富的实战经验。
展开
-
漫谈callback
今天,让我们一起来聊聊这些玩意。原创 2023-12-11 09:15:01 · 985 阅读 · 0 评论 -
浅谈CompletableFuture
到这里,你可能懵逼了,那这个CompletionStage定义了那么多方法,到底是干啥用的?异步线程又为何会回调它传入的函数接口的方法呢,BiConsumer#accept()明明不是Runnable#run()、Callable#call()呀!原创 2023-12-11 09:11:05 · 1889 阅读 · 0 评论 -
管程模型与锁
学习多线程是为了提高任务执行效率,但多线程又引入了线程安全问题。所谓线程安全问题,可以简单地理解为数据不一致(与预期不一致)。什么时候可能出现线程安全问题呢?多线程环境有共享数据有多条语句操作共享数据/单条语句本身非原子操作(比如i++虽然是单条语句,但并非原子操作)比如线程A、B同时对int count进行+1操作(初始值假设为1),在一定的概率下两次操作最终结果可能为2,而不是3。那么加锁为什么能解决这个问题呢?原创 2023-12-10 09:43:56 · 995 阅读 · 0 评论 -
设计山寨线程池
私以为造轮子几乎是最好的学习方式,甚至没有之一。不了解设计,就无法把握整体。没看过代码,就无法完善细节。另外,从创作者的角度来说,直接分析源码有时太困难了,代码太多,抽象层次太深。如果可以通过造轮子,把抽象层次减少一些,采用平铺直叙的方式呈现,那么读者理解起来也就更容易些。既然造轮子这么好,那就,拿来吧你。今天带大家造一个线程池。原创 2023-12-09 08:31:13 · 1017 阅读 · 0 评论 -
线程池继承体系
线程池的初衷是屏蔽线程的创建、使用及调度(复用)等细节,让使用者通过简单的提交即可执行任务。基于这个设计思想,JDK设计了一个顶级接口:Executor [ɪɡˈzekjətər] (念作:乙哥贼Q特)它只定义了一个方法:execute() [ˈeksɪkjuːt] (念作:爱克seeQ特)正如方法注释所说的,execute()作为接口方法,并没有强制子类如何实现。// 搞一个Executor实例// 提交任务即可,其他细节它帮你搞定(屏蔽底层细节,分离线程类和任务类)r.run();原创 2023-12-09 08:05:42 · 1246 阅读 · 0 评论 -
从线程间通信聊到阻塞队列
定义:针对同一个资源的操作有不同种类的线程。说人话就是:共享资源+多线程,最典型的例子就是锁和生产者消费者(关于锁,后面有专门的章节介绍,这里以生产者-消费者为例子讲解)。以现实生活为例。消费者和生产者就像两个线程,原本做着各自的事情,厂家管自己生产,消费者管自己买,一般情况下彼此互不影响。但当物资到达某个临界点时,就需要根据供需关系适当作出调整。当厂家做了一大堆东西,产能过剩时,应该暂停生产,扩大宣传,让消费者过来消费当消费者发现某个热销商品售罄,应该提醒厂家尽快生产。原创 2023-12-08 08:14:00 · 951 阅读 · 0 评论 -
FutureTask
为什么要介绍FutureTask呢?FutureTask为什么有意思呢?假设一个场景,要求设计一个方法,专门用来执行。这个需求的诡异之处在于:刚开始立即返回的result肯定不包含结果(毕竟耗时任务),但随后通过result.get()却又能得到结果!如果让我们从零开始实现这个需求,是比较困难的,好在JDK已经设计出FutureTask,它专门为这种场景而生。FutureTask就像个魔术盒,刚开始是空的,你抱着它走了几步,再打开时里面竟然出现了一个苹果,amazing!原创 2023-12-08 08:07:24 · 983 阅读 · 0 评论 -
多线程基础
多线程向来是面试的重灾区,它真的很难。一般来说,普通的开发人员很少有机会能直接写多线程,一般都是使用封装好的工具类或者JDK提供的API,但并不意味着我们可以不用了解多线程。今天我们再来强化一下多线程的基础知识。原创 2023-12-07 09:02:52 · 914 阅读 · 0 评论 -
如何学习Java并发编程
2012年我刚转行到互联网,那年夏天我从传统通信行业跳槽到互联网行业。那是我成年后看的第一部国产动画片,可谓惊为天人。里面有所谓的八奇技,其中有一门绝技称为:术之尽头,炁体源流。虽然目前作者还没有揭开谜底,但从定义上来说,炁体源流大概有“追本溯源,回归本质”的含义。为什么扯这些呢?很多人学不好Java并发编程,恰恰是因为没有抓住本质。原创 2023-12-07 08:59:17 · 1321 阅读 · 0 评论