`

「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景

阅读更多

 

 关注我的架构技术公众号:“架构师修炼宝典”一周出产1-2篇技术文章,希望在你的架构技术路上有我的点滴陪伴!

作为一个合格的Java程序员,必须要对并发编程有一个深层次的了解,在很多互联网企业都会重点考察这一块。可能很多工作3年以上的Java程序员对于这一领域几乎没有太多研究。所以在接下来内容中,我会将并发编程整个领域由浅到深做非常全面的分析。

内容导航

  • 从操作系统的发展了解进程、线程模型
  • 线程的优势
  • 线程的生命周期
  • 线程的应用场景

了解进程、线程模型

每次学习一个新技术,我会先去了解这个技术的背景,这个过程看似浪费时间,其实在后续的学习过程中,能够促进理解很多问题。所以对于线程这个概念,我会先从操作系统讲起。因为操作系统的发展带来了软件层面的变革。 从多线程的发展来看,可以操作系统的发展分为三个历史阶段:

  • 真空管和穿孔卡片
  • 晶体管和批处理系统
  • 集成电路和多道程序设计

最早的计算机只能解决简单的数学运算问题,比如正弦、余弦等。运行方式:程序员首先把程序写到纸上,然后穿孔成卡票,再把卡片盒带入到专门的输入室。输入室会有专门的操作员将卡片的程序输入到计算机上。计算机运行完当前的任务以后,把计算结果从打印机上进行输出,操作员再把打印出来的结果送入到输出室,程序员就可以从输出室取到结果。然后,操作员再继续从已经送入到输入室的卡片盒中读入另一个任务重复上述的步骤。

操作员在机房里面来回调度资源,造成计算机存在大量的空闲状态 。而当时的计算机是非常昂贵的,人们为了减少这种资源的浪费。就采用了 批处理系统来解决

批处理操作系统的运行方式:在输入室收集全部的作业,然后用一台比较便宜的计算机把它们读取到磁带上。然后把磁带输入到计算机,计算机通过读取磁带的指令来进行运算,最后把结果输出磁带上。批处理操作系统的好处在于,计算机会一直处于运算状态,合理的利用了计算机资源。(运行流程如下图所示)

「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景

(注:此图来源于现代操作系统)

批处理操作系统虽然能够解决计算机的空闲问题,但是当某一个作业因为等待磁盘或者其他I/O操作而暂停,那CPU就只能阻塞直到该I/O完成,对于CPU操作密集型的程序,I/O操作相对较少,因此浪费的时间也很少。但是对于I/O操作较多的场景来说,CPU的资源是属于严重浪费的。

多道程序设计的出现解决了这个问题,就是把内存分为几个部分,每一个部分放不同的程序。当一个程序需要等待I/O操作完成时。那么CPU可以切换执行内存中的另外一个程序。如果内存中可以同时存放足够多的程序,那CPU的利用率可以接近100%。 在这个时候,引入了第一个概念- 进程, 进程的本质是一个正在执行的程序,程序运行时系统会创建一个进程,并且给每个进程分配独立的内存地址空间保证每个进程地址不会相互干扰。同时,在CPU对进程做时间片的切换时,保证进程切换过程中仍然要从进程切换之前运行的位置出开始执行。所以进程通常还会包括程序计数器、堆栈指针。

有了进程以后,可以让操作系统从宏观层面实现多应用并发。而并发的实现是通过CPU时间片不端切换执行的。对于单核CPU来说,在任意一个时刻只会有一个进程在被CPU调度

有了进程以后,为什么还会出现线程呢?

在一个应用进程中,会存在多个同时执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的任务也被阻塞。举个具体的例子来说,我们平常用word文档编辑内容的时候,都会有一个自动保存的功能,这个功能的作用是,当计算机出现故障的情况下如果用户未保存文档,则能够恢复到上一次自动保存的点。假设word的自动保存因为磁盘问题导致写入较慢,势必会影响到用户的文档编辑功能,直到磁盘写入完成用户才可编辑,这种体验是很差的。如果我们把一个进程中的多个任务通过线程的方式进行隔离,那么按照前面提到的进程演进的理论来说,在单核心CPU架构中可以通过CPU的时间片切换实现线程的调度充分利用CPU资源以达到最大的性能。加Q群:725219329可获取一份Java架构进阶技术精品视频。(高并发+Spring源码+JVM原理解析+分布式架构+微服务架构+多线程并发原理+BATJ面试宝典)

我们用了比较长的篇幅介绍了进程、线程发展的历史。总的来说是人们对于计算机的要求越来越高;对于计算机本身的资源的利用率也在不断提高。

线程的优势

前面分析了线程的发展历史,这里简单总结一下线程有的优势如下

  • 线程可以认为是轻量级的进程,所以线程的创建、销毁要比进程更快
  • 从性能上考虑,如果进程中存在大量的I/O处理,通过多线程能够加快应用程序的执行速度(通过CPU时间片的快速切换)。
  • 由于线程是CPU的最小调度单元,所以在多CPU架构中能够实现真正的并行执行。每一个CPU可以调度一个线程

这里有两个概念很多人没有搞明白,就是并行和并发
并行:同时执行多个任务,在多核心CPU架构中,一个CPU核心运行一个线程,那么4核心CPU,可以同时执行4个线程
并发:同处理多个任务的能力,通常我们会通过TPS或者QPS来表示某某系统支持的并发数是多少。

总的来说,并行是并发的子集。也就是说我们可以写一个拥有多线程并行的程序,如果在没有多核心CPU来执行这些线程,那就不能以并行的方式来运行程序中的多个线程。所以并发程序可以是并行的,也可以不是。Erlang之父Joe Armstrong通过一张图型的方式来解释并发和并行的区别,图片如下

「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景

线程的生命周期

线程是存在生命周期的,从线程的创建到销毁,可能会经历6种不同的状态,但是在一个时刻线程只能处于其中一种状态

  • NEW:初始状态,线程被创建时候的状态,还没有调用start方法
  • RUNNABLE:运行状态,运行状态包含就绪和运行两种状态,因为线程启动以后,并不是立即执行,而是需要通过调度去分配CPU时间片
  • BLOCKED:阻塞状态,当线程去访问一个加锁的方法时,如果已经有其他线程获得锁,那么当前线程会处于阻塞状态
  • WAITING:等待状态,设置线程进入等待状态等待其他线程做一些特定的动作进行触发
  • TIME_WAITING:超时等待状态,和WAITING状态的区别在于超时以后自动返回
  • TERMINATED:终止状态,线程执行完毕

下图整理了线程的状态变更过程及变更的操作,每一个具体的操作原理,我会在后续的文章中进行详细分析。

「阿里面试系列」搞懂并发编程,轻松应对80%的面试场景

这里有一个问题大家可能搞不明白,BLOCKED和WAITING这两个阻塞有什么区别?

  • BLOCKED状态是指当前线程在等待一个获取锁的操作时的状态。
  • WAITING是通过Object.wait或者Thread.join、LockSupport.park等操作实现的
  • BLOCKED是被动的标记,而WAITING是主动操作
  • 如果说得再深入一点,处于WAITING状态的线程,被唤醒以后,需要进入同步队列去竞争锁操作,而在同步队列中,如果已经有其他线程持有锁,则线程会处于BLOCKED状态。所以可以说BLOCKED状态是处于WAITING状态的线程重新唤醒的必经的状态

线程的应用场景

线程的出现,在多核心CPU架构下实现了真正意义上的并行执行。也就是说,一个进程内多个任务可以通过多线程并行执行来提高程序运行的性能。那线程的使用场景有哪些呢?

  • 执行后台任务,在很多场景中,可能会有一些定时的批量任务,比如定时发送短信、定时生成批量文件。在这些场景中可以通过多线程的来执行
  • 异步处理,比如在用户注册成功以后给用户发送优惠券或者短信,可以通过异步的方式来执行,一方面提升主程序的执行性能;另一方面可以解耦核心功能,防止非核心功能对核心功能造成影响
  • 分布式处理,比如fork/join,将一个任务拆分成多个子任务分别执行
  • BIO模型中的线程任务分发,也是一种比较常见的使用场景,一个请求对应一个线程。加Q群:725219329可获取一份Java架构进阶技术精品视频。(高并发+Spring源码+JVM原理解析+分布式架构+微服务架构+多线程并发原理+BATJ面试宝典)

合理的利用多线程,可以提升程序的吞吐量。同时,还可以通过增加CPU的核心数来提升程序的性能,这就体现了伸缩性的特点

关注我的架构技术公众号:“架构师修炼宝典”一周出产1-2篇技术文章,希望在你的架构技术路上有我的点滴陪伴!

0
0
分享到:
评论

相关推荐

    深入理解高并发编程-核心技术原理

    【深入理解高并发编程-核心技术原理】是一本专注于讲解高并发编程核心概念和技术的书籍,由阿里P8级别的架构师及Mykit系列开源框架作者撰写。本书内容涵盖源码分析、基础案例、实战案例和面试相关知识,旨在帮助读者...

    阿里巴巴面试大礼包(最近几年阿里巴巴笔试和面试题)

    阿里巴巴作为中国乃至全球知名的互联网科技巨头,其面试过程备受求职者关注。这个“阿里巴巴面试大礼包”涵盖了近年来阿里巴巴在笔试和面试中所使用的题目,旨在帮助求职者更好地准备,提高成功通过的可能性。以下是...

    java面试(包含阿里面试题).rar

    这份"java面试(包含阿里面试题).rar"压缩包文件提供了全面的准备材料,帮助求职者为Java工程师的职位做好充分准备。 1. **最新葵花宝典.Java软件工程师笔试面试必备.doc**:这份文档可能涵盖了Java基础知识,包括...

    阿里面试-Java面试八股文

    4. **并发编程**: - 并发是多线程环境下的关键概念,面试中会涉及到synchronized、volatile、Lock、ThreadLocal等关键字以及线程池的使用和优化。 - 高级并发面试专题将深入探讨并发模型、并发工具类、并发设计...

    java面试题大全(阿里面试题)

    Java面试题大全,尤其是阿里面试题,是求职者准备Java开发者职位面试的重要参考资料。这份资料集涵盖了广泛的Java编程、设计模式、数据结构、算法、框架、数据库、并发等多个领域的知识点,旨在帮助求职者全面理解...

    阿里校招面试笔试题

    6. **Java/Python/C++编程基础**:熟悉至少一种主流编程语言,包括类、对象、继承、多态、异常处理、IO流、并发编程等。 7. **计算机基础**:计算机组成原理,CPU、内存、硬盘的工作原理,编译原理,位运算,进制...

    2021最新面试经验,包括百度、阿里、美团、字节跳动算法面试题总结经验

    二、阿里面试题 阿里巴巴作为电商领域的领头羊,其面试题往往与数据结构和算法紧密相关。面试中可能会遇到的问题有:如何设计一个高并发的购物车系统,或者如何实现高效的推荐算法。此外,链表操作、二叉树遍历、...

    亲测阿里P6P7面试经历以及面试题,掌握了大概率offer

    3. 并发编程:掌握Java中的多线程和并发机制,理解synchronized、volatile关键字的使用和原理,以及并发包中的重要类,如ConcurrentHashMap、ReentrantReadWriteLock等。 4. IO/NIO:熟悉Java的I/O模型,掌握传统的...

    毕业季分享-阿里面试经验

    在毕业季,找工作的学生们面临着各种面试挑战,尤其是对于渴望进入顶级互联网公司的毕业生而言,如阿里巴巴、百度、美团、钉钉以及字节跳动和抖音等。这些公司的面试流程严谨,问题涵盖广泛,旨在考察候选人的综合...

    阿里面试题

    根据给定的文件信息,以下是对“阿里面试题”中涉及的关键知识点的详细解析: ### 1. ES(Elasticsearch) ...对于准备参加阿里面试的开发者来说,熟练掌握这些知识将有助于更好地应对面试挑战。

    java面试题,包含常见面试题,阿里万字面试题,字节跳动面试题,数据库面试题,下载这一套就够,还是免费下载

    Java面试题是每个Java开发者在求职过程中必须面对的挑战,涵盖了广泛的领域,包括但不限于基础知识、设计模式、并发编程、集合框架、JVM优化、数据库、网络协议等。本篇文章将根据提供的文件信息,深入探讨这些关键...

    2023java最新阿里巴巴面试题,2023java最新阿里巴巴面试题

    这些知识点覆盖了Java的基础、面向对象特性、内存管理、异常处理和并发编程等多个方面,是Java程序员应该掌握的核心技能。在阿里巴巴这样的大型企业面试中,这些知识不仅要求理解,还需要能够灵活应用和深入分析。

    java面试八股文各类面试题

    在准备Java面试时,了解和掌握一系列核心知识点是至关重要的。以下是一些基于标题和描述中的关键...阅读提供的PDF资料,如"Java并发编程面试题八股文.pdf"和"Spring面试题八股文.pdf",将有助于巩固和扩展这些知识。

    阿里面试(java)

    在准备阿里面试的过程中,Java开发者需要掌握一系列关键知识点,这些知识不仅涵盖了语言基础,还包括了高级特性、设计模式、框架应用以及实际开发中的最佳实践。以下是对标题和描述中涉及知识点的详细解释: 1. **...

    面试题,c/c++,华为,小米,腾讯,阿里,百度等

    8. **多线程和并发编程**:在现代软件开发中,多线程和并发是常见的需求。你需要理解线程的基本概念,如线程同步(互斥锁、信号量、条件变量等)、线程池,以及C++11及更高版本提供的线程库。 9. **STL深入理解**:...

    【Java核心知识面试】-阿里Java面试集锦.zip

    【Java核心知识面试】-阿里Java面试集锦.pdf 这份资料是针对Java开发人员,特别是对准备参加阿里巴巴集团面试的求职者所设计的面试指南。它涵盖了Java编程语言的各个方面,旨在帮助求职者全面理解并掌握Java的核心...

    阿里Java应聘面试问题大全.zip

    这个压缩包文件"阿里Java应聘面试问题大全.zip"很可能是包含了阿里面试过程中可能会遇到的各种Java相关问题的集合。下面,我们将根据这些标签和文件名来详细讨论一些可能的Java面试知识点。 1. **Java基础** - 类...

    阿里面试问题总结

    15. **并发编程**:Java并发库(如ExecutorService,Future,Callable,CyclicBarrier,Semaphore等)的使用和理解是高级Java开发者必备的技能。 以上就是阿里面试中可能出现的一些Java相关知识点,深入理解和熟练...

    阿里巴巴面试题

    【阿里巴巴面试题】涉及到的是阿里巴巴公司对于应聘者在IT领域,特别是Java编程方面的能力测试。这类面试题通常涵盖广泛,旨在考察候选人的基础知识、编程能力、问题解决技巧以及对新技术的理解。以下是一些可能出现...

    java-面试指北PDF版本(最新)

    提升编程硬实力包括深入理解数据结构与算法,熟悉设计模式,掌握多线程和并发编程,以及对框架和库的熟练运用。定期参与编程挑战和阅读源码也有助于提升。 6. **如果面试官问“你有什么问题问我吗?”该如何回答?...

Global site tag (gtag.js) - Google Analytics