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

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没有
  • 使用线程池

    更新中。。。

参考

黑马程序员面经

相关推荐
爱上语文24 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people27 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
qmx_071 小时前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
X同学的开始1 小时前
数据结构之二叉树遍历
数据结构
为风而战2 小时前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
编程零零七3 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
技术无疆3 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
AIAdvocate4 小时前
Pandas_数据结构详解
数据结构·python·pandas
(⊙o⊙)~哦4 小时前
JavaScript substring() 方法
前端
无心使然云中漫步5 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript