程序

是为完成特定的任务,用某种语言编写的一组指令的集合,即一段静态的代码,或者说代码块。

进程

是一个程序的执行过程,或者说是正在运行的一个程序,这是一个动态的过程:有它自身的产生、运行、消亡的过程,也就是生命周期。

  • 例如运行中的浏览器。在没有使用的时候它是一个程序,当我们使用它搜索、看新闻、的时候,它变成了一个进程。
  • 程序是静态的,进程是程序运行之后的状态。
  • 进程是资源分配的单位,系统会在运行时给每个进程分配不同的内存区域。

线程

线程是进程的进一步细化,是一个程序内部的一条执行路径

  • 如果一个进程中可以并行执行多个线程,那么可以说这个进程对应的程序是支持多线程的。
    • 比如360同时进行垃圾清理和木马查杀就可以看作并行执行两个线程。
  • 线程作为进程的调度和执行单位,每个线程都有自己独立的程序计数器和运行栈,同时线程之前的切换开销比较小。
  • 一个进程中的多个线程共享进程的内存空间,可以访问相同的变量和对象,这使得线程之间的通信更加简单、高效。但是也会造成数据的安全隐患

image.png

如上图所示,这是JVM 的内存模型,其中红色线框的是线程私有的,每个线程都有自己的一份,但是黑色框的方法区和堆是整个进程的,所有线程共享的内存,如果多个线程对其中的数据进行了修改,就有可能造成安全的问题,这就是线程不安全的引出。

而线程同步就是为了解决线程不安全的问题而产生的。

单核Cpu与多核Cpu

  • 单核:假的多线程,因为在一个时间单元(时间点)内,只能执行一个任务。例如后厨只有一个厨师,他能在一个菜刚下锅的时候马上去炒另一个菜,后厨能够源源不断的上菜,让你看起来是有多个厨师,实际上在一个时间点,他只能炒一个菜。
  • 多核:多个厨师同时炒多个菜。
  • 一个java应用程序Java.exe 至少有三个进程:main主线程、gc垃圾回收线程,异常处理线程。

并行与并发

  • 并行:多个Cpu同时执行多个任务。
  • 并发:一个Cpu(采用时间分片)同时执行多个任务。

使用多线程的优点

  • 背景:在单核Cpu的情况下,只使用单线程先后完成任务(先后完成),由于线程切换的原因,会比多线程更快一些,那为何还要使用多线程呢。
  • 优点:
    • 提高应用程序的响应,对图形化界面更有意义,能够提高用户体验。
    • 提高计算机Cpu的利用率,尽可能的压榨其性能。
    • 改善程序结构,将长且复杂的进程分为多个线程,独立运行利于理解和修改。

什么时候需要多线程?

  • 程序需要同时执行两个或多个任务
    • 如上面说到的360 既要查杀木马又要清理垃圾
  • 程序需要执行一些等待的任务时。
    • 比如浏览网页时,在网络条件不好的情况下总是文本先出现,图片后出现,加载图片就是一个等待的任务。
  • 需要一些后台运行的程序时
    • 如java 程序的垃圾回收线程,主线程在运行,垃圾回收不可能等主线程运行完成之后再进行垃圾回收,这样内存很容易就被占满了。