为了完成特定的任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象
是程序的一次执行过程,或者是正在运行的一个程序,是一个动态的过程
进程可以进一步的细化为线程,是一个程序内部的一条执行路径
线程的概念(简化版):程序内部的一条执行路径
线程作为调度和执行的单位,每个线程拥有独立的运行栈(虚拟机栈)和程序计数器
一个进程中的多个线程共享相同的内存单元/内存地址空间(也就是共享了相同的堆空间和方法区)
如果一个进程同一时间只能执行一个线程的话,我们称这个进程是一个传统进程(也就是只支持单线程)
若一个进程同一时间并行执行多个线程,我们就说是支持多线程的(也就是多线程进程)
每个线程都会有一份独立的虚拟机栈和程序计数器(PC寄存器)
每个进程都会有一份独立的方法区和堆空间
一个进程中的每个线程共享这个进程的内存单元(方法区和堆空间)
如果堆里面有一个变量,那么我们这个进程中的多个线程都可以对这个变量进行修改
系统在运行时会为每个进程分配不同的内存区域,每个进程有独立的存储空间,这个存储空间中包含了 1.方法区,2.堆空间,3.本地方法栈,4.虚拟机栈(运行栈),5.程序计数器(PC寄存器),其中的堆空间和方法区会被这个进程中的所有线程共享,而虚拟机栈和程序计数器每个线程都会有独立的一份
一个进程中的多个线程共享这个进程的方法区和堆空间,也就是一个进程中的多个线程从从同一个堆中分配对象,也就是说多个线程可以访问相同的变量和对象,这就使得线程之间的通信更加的简便,高效,但是多个线程操作相同的共享的系统资源可能就会带来安全上的隐患
在后面我们会讲到JVM的时候会提到这个JVM的调优
单核CPU中的多线程是一种假的多线程
多核CPU中的多线程才是真正的多线程
在多核CPU中如果我们遇到多线程的问题时,每个核就可以去干一件事,这个时候会大大提高执行的效率,所以我们说多核CPU中的多线程才是真正的多线程
一个java应用程序java.exe至少有三个线程main()主线程,gc()垃圾回收线程,异常处理线程
多个CPU同时执行多个任务
eg:多个人同时做不同的事
一个CPU(采用时间片)同执行多个任务
eg:秒杀
如果我们很多人在同时秒杀一个商品,这个时候我们有很多人在同一时间点做了一件事,灭每个人要购买的操作就可以看做一个线程,这个时候CPU如果每个CPU都只执行一个线程肯定是不够的,这个时候我们就需要每个CPU去并发的执行多个线程
单核CPU处理多线程是一种假的多线程,它是使用了并发的方式去处理多个线程
多核CPU处理多线程有的时候是并行,有的时候也是并发的