和阿里P8大佬面试互怼了半小时的Fork/Join的原理!

2024-03-25 15:50

本文主要是介绍和阿里P8大佬面试互怼了半小时的Fork/Join的原理!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

只听到P8大佬不急不慢问道:谈谈对JDK并发工具的认识?

我开始仔细梳理多年的并发八股文积累的经验,道:
线程池、Future、CompletableFuture和CompletionService这些并发工具都帮助SE站在任务角度解决并发问题,而非纠结于线程之间协作的细节,比如线程之间如何实现等待、通知。

  • 简单并行任务
    线程池+Future 组合拳解决
  • 任务之间有聚合关系
    AND、OR聚合,都可以CompletableFuture一招鲜解决
  • 批量的并行任务
    CompletionService一把梭方案

并发编程可分为三个层面问题

  • 分工
  • 协作
  • 互斥

当关注于任务时,你会发现你的视角已脱离于并发编程细节,而使用现实世界思维模式,类比现实世界的分工,其实线程池、Future、CompletableFuture和CompletionService都可列为分工问题。

  • 简单并行任务聚合任务批量并行任务的现实的工作流程图

    这三种任务模型,基本覆盖日常工作中的并发场景,但肯定不全面,还有一种“分治”任务模型。

分治,分而治之,一种解决复杂问题的思维方法和模式。把一个复杂问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解。理论上解决每一个问题都对应着一个任务,所以对于问题的分治,实际上就是对于任务的分治。

P8 大佬直接开问,那你说说什么是分治任务模型?
分治任务模型可分为两个阶段:

  1. 任务分解
    将任务迭代地分解为子任务,直至子任务可计算出结果
  2. 结果合并
    逐层合并子任务的执行结果,直至获得最终结果

就像官僚制度一样:

那你平时开发是如何使用Fork/Join的?

还好这道题,我面试前也准备了…

Fork/Join是一个并行计算框架,以支持分治任务模型

  • Fork对应分治任务模型里的任务分解
  • Join对应结果合并

Fork/Join计算框架主要包含两部分:

  • 分治任务的线程池ForkJoinPool
  • 分治任务ForkJoinTask

这俩的关系类似于 ThreadPoolExecutorRunnable,都是提交任务到线程池,只不过分治任务有自己独特的任务类型ForkJoinTask。

ForkJoinTask

JDK7 提供,一个抽象类,核心方法如下:

  • fork()
    异步执行一个子任务
  • join()
    阻塞当前线程来等待子任务的执行结果

ForkJoinTask有两个子类——RecursiveAction和RecursiveTask,显然都是用递归处理分治任务。这两个子类都定义了抽象方法compute():

  • RecursiveAction#compute()无返回值

  • RecursiveTask#compute()有返回值

    注意到这俩类都是抽象类,使用要定义子类实现。


只见 P8 开始冷笑,看来要问源码级别原理了!

那你说下Fork/Join的工作原理

还好我知道阿里面试套路,凡是 java 工具,必问深入的源码。

因为Fork/Join的核心就是ForkJoinPool,让我来深入讲解ForkJoinPool原理。

ThreadPoolExecutor本质是个生产者-消费者实现,内部有一个任务队列,作为生产者和消费者的通信媒介。ThreadPoolExecutor可以有多个工作线程,这些工作线程都共享一个任务队列。

ForkJoinPool本质上也是一个生产者-消费者的实现,但更智能

  • ForkJoinPool工作原理图

ThreadPoolExecutor内部只有一个任务队列,而ForkJoinPool内部有多个任务队列,当调用ForkJoinPool#invoke()submit()提交任务时,ForkJoinPool把任务通过路由规则提交到一个任务队列,如果任务在执行过程中会创建出子任务,那么子任务会提交到工作线程对应的任务队列。

如果工作线程对应的任务队列空,是不是就没活儿干了?
No!ForkJoinPool有个“任务窃取”机制,若工作线程空闲了,它会“窃取”其他工作任务队列里的任务,例如刚才那个图中,线程T2对应任务队列已空

那它会“窃取”线程T1对应的任务队列的任务。这样所有工作线程都不会闲着。

ForkJoinPool的任务队列采用的是双端队列,工作线程正常获取任务和“窃取任务”分别从任务队列不同的端消费,这也能避免很多不必要的数据竞争。

ForkJoinPool支持任务窃取机制,能够让所有线程的工作量基本公平,不会出现线程有的很忙,有的一直在摸鱼,所以性能很好,是个很公正的领导。
Java8的Stream API里面并行流也是基于ForkJoinPool。
默认,所有的并行流计算都共享一个ForkJoinPool,这个共享的ForkJoinPool的默认线程数是CPU核数;
若所有并行流计算都是CPU密集型,完全没有问题,但若存在I/O密集型并行流计算,那很可能因为一个很慢的I/O计算而拖慢整个系统的性能。所以建议用不同ForkJoinPool执行不同类型的计算任务。

参考

  • https://www.liaoxuefeng.com/article/1146802219354112

这篇关于和阿里P8大佬面试互怼了半小时的Fork/Join的原理!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845485

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

java面试常见问题之Hibernate总结

1  Hibernate的检索方式 Ø  导航对象图检索(根据已经加载的对象,导航到其他对象。) Ø  OID检索(按照对象的OID来检索对象。) Ø  HQL检索(使用面向对象的HQL查询语言。) Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。 QBC/QBE离线/在线) Ø  本地SQL检索(使用本地数据库的SQL查询语句。) 包括Hibern

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。