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没有
- 使用线程池
更新中。。。