【八股文】并发编程相关考点

1.线程和进程和协程的区别

  • 进程操作系统中资源分配和调度的基本单位,是程序的一次执行过程,因此是动态的,即一个进程从创建到运行再到消亡。每个进程都有独立的内存空间,一位置一个进程的变量修改不会影响到其他经常。进程之间的同学通常需要通过操作系统提供的机制,如管道、消息队列和共享内存等。进程之间切换的开销较大,因为进程之间是完全隔离的,每次切换都需要保存当前进程的上下文并加载新进程的上下文。
  • 线程 是一个比进程更小的执行单元,是CPU调度和分派的基本单位。一个进程的过程可以产生多个线程,这些线程共享同一进程的资源,如堆和方法区资源。线程之间的通信和数据共享要比进程间容易得多。线程切换的开销比进程小,因为它们共享相同的内存上下文,但多个线程同时访问共享资源时,需要同步机制来防止数据竞争和不一致的情况,比如使用锁或者信号量。
  • 协程 是一个比线程更轻量级的执行单元,它在用户空间内调度和管理。协程的控制权转移由协程自身决定,而不是由操作系统调度器决定。这就意味着协程可以在任何地方暂停和恢复执行,协程之间的切换开销远低于线程。所以协程非常适合用于I/O密集型的任务,因为它们可以在等待I/O操作完成时主动放弃控制权,然后在完成后恢复执行,这样可以避免线程在等待I/O时的阻塞状态,提高系统的并发性能。
进程 线程 协程
定义 操作系统资源分配和调度的基本单位 进程内执行单元,CPU 调度和分派的基本单位 用户空间内的轻量级执行单元
内存 拥有独立的内存空间 共享所属进程的内存空间 共享所属进程和线程的内存空间
开销 创建和切换成本高 创建和切换成本较低 创建和切换成本基地
通信 需要通过进程间进行通信 可以直接访问共享数据 可以直接访问共享数据
并发能力 较低,受限于系统调度和资源限制 较高,受限于系统调度和资源限制 极高,几乎无限制,受限于系统资源
调度 由操作系统调度 由操作系统调度 由用户空间调度
隔离性 最强,完全隔离 较弱,共享内存和资源 最弱,共享内存和资源
使用场景 高隔离需求,多核CPU利用 高效资源共享,多任务处理 I/O密集型任务,异步编程

2.堆和方法区的区别

堆和方法区都是所有线程共享的资源堆是进程中最大的一块内存,主要存放用户新创建的对象。方法区主要用于存放已被加载的类信息、常量、静态变量等。

3.并发和并行的区别

在多核CPU下

  • 并发:两个及其以上的作业在同一时间段执行
  • 并行:两个及其以上的作业在同一时刻执行

4.同步和异步的区别

同步:发出一个调用后,在没有得到结果之前,会一直等待

异步:发出一个调用后,不用等待结果,该调用直接返回

在项目中,例如注册完成后会给邮箱发一条注册成功的信息,假设注册完成需要50ms,而发一条注册成功的信息到邮箱需要50ms,如果是同步则一共需要50ms,而异步的话,就只需要50ms,因为只需要注册完成就行了,发送信息由消息队列来异步发送。

5.多线程相关问题

  • 为什么使用多线程:为了减少线程上下文切换的开销,现在的系统要求百万甚至千万级并发量,利用多线程机制可以大大提高系统的并发能力和性能。
  • 多线程带来的问题:内存泄漏、死锁、线程不安全(对同一份数据进行访问,是否能够保证数据的正确性和一致性)
  • 单核CPU运行多个线程效率一定会高吗?不会,要看是CPU密集型还是IP密集型,如果是CPU密集型,多个线程同时运行会导致频繁的线程切换,会影响效率,而IO密集型会有很多线程来提高效率。

6.创建线程的方法有哪些?

  • 继承Tread类重写run方法
  • 实现Runnable接口重写run方法
  • 实现Callable接口,重写call方法,通过FutureTask类来传入到Thread中。与Runnable的区别
    • call() 方法有返回值(String类型),而run方法没有
    • call() 方法可以抛异常,而run方法不行
    • callable接口有泛型,而Runnable没有
  • 使用线程池

    更新中。。。

参考

黑马程序员面经

相关推荐
m0_748236113 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Jackey_Song_Odd12 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
ProtonBase14 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61715 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_7482489417 分钟前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5
乐之者v21 分钟前
leetCode43.字符串相乘
java·数据结构·算法
m0_7482356128 分钟前
从零开始学前端之HTML(三)
前端·html
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
️南城丶北离2 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
一个处女座的程序猿O(∩_∩)O2 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js