JUC:并发基础回顾

174 阅读2分钟

什么是线程和进程?

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。

进程是程序的一次执行过程,是系统运行的基本单位

线程是比进程更小的执行单位

一个进程在执行过程中可以有多个线程

简单说:进程是对资源的管理和分配的单位,线程是资源的调度的基本单位。

请简要描述线程与进程的关系,区别及优缺点?

从JVM的角度说一下线程和进程的关系:

线程是进程划分更小的运行单位,线程是独立的而进程不一定;

线程开销小但不利于资源的管理和保护,而进程正相反

程序计数器为什么是私有的?

作用:线程切换后能恢复到正确的执行位置

虚拟机栈和本地方法栈为什么是私有的?

作用:保证线程中的局部变量不被别的线程访问到

在JVM中,只有方法去和堆内存是线程共享的,其他都是线程私有的。

方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

说说并发与并行的区别?

并发:是指多个事情在同一个时间段中执行

并行:是指多个事情在同一时刻执行

为什么使用多线程?

开销小,适应时代的发展,可以实现多核多线程,减少了线程上下文切换的开销

使用多线程可能带来什么问题?

内存泄漏、上下文切换、死锁还有受限于硬件和软件的资源闲置问题

说说线程的生命周期和状态?

  1. new
  2. runnable(running <---> ready)
  3. blocked
  4. waiting
  5. time_waiting
  6. terminated

详情请看:点击

什么是上下文切换?

cpu只能在任意时刻被一个线程使用,为了雨露均沾,cpu为每个线程分配时间片,当时间片用完后。线程就会重新处于一个就绪状态,让其他线程使用,这就属于上下文切换,如果增加了cpu核心数,则大大减少了上下文的切换时间。

为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

run方法只是普通方法,执行是按照main方法中的调用函数执行的,但是使用start方法时会使得线程进入就绪状态,只要分配到时间片,则就可以马上执行run方法中的内容,相比于run方法的执行,start方法中间多了创建和就绪的过程。

更多内容:

JUC之文章整理以及汇总