先简单了解一下进程:如图每一个都叫一个进程


进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。

单线程:执行任务是串行,所谓串行就是有序的进行,一步步执行,同时只执行一个任务

多线程:执行任务是并行的,可以理论实现同时执行多个任务,比如下载多个文件就是利用了多线程,其他多功能同时进行的也是类似(产生cpu浪费的情况下用多线程合适 )

栈的概念:

1.在计算机系统中,栈可以称之为栈内存是一个具有动态内存区域,存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象程序可以将数据压入栈中,也可以将数据从栈顶弹出。压栈操作使得栈增大,而弹出操作使栈减小。栈用于维护函数调用的上下文,离开了栈函数调用就没法实现。

线程栈:

2.线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况。

    1.线程名字,id,线程的数量等。

     2.线程的运行状态,锁的状态(锁被哪个线程持有,哪个线程在等待锁等)

     3.调用堆栈(即函数的调用层次关系)调用堆栈包含完整的类名,所执行的方法,源代码的行数。

 线程栈的方法都是拷贝过来的,每个方法都称为栈帧

几点注意:

     1.每个线程的方法,以及在Run方法内部声明的变量都是拷贝的,不会影响其他线程,所以这些变量是安全的,但是声明在外部的变量则不一定安全(这里就需要了解锁的概念)与第二条呼应

      2. 对于共同的方法外的变量进行操作时,会出现问题,对于并发操作不能处理

      3.堆里的信息是公共的,栈的信息是拷贝的

而上面所说的的不安全,不合理问题就要通过加锁来保护数据按照正确逻辑执行,保证线程安全。

锁:在并发的地方加锁 ,锁会设置一个标记 , 影响多个线程 , 保证数据的有效性 . 

实际操作此处不再展示,可以参考

1.多线程简答模拟售货员买票https://blog.csdn.net/weixin_43900387/article/details/104004711

2.JAVA多线程实现数组复制:https://mp.csdn.net/postedit/104024736