java多线程基础概念

大纲:java多线程知识体系`

程序`:为了完成某一功能, (用某种语言编写的一组指令的集合),是一段静态的代码块

进程:程序的一次执行过程,是正在运行的程序,有着完整的生命周期,是资源分配的基本单位,由程序控制块(PCB)、程序段、数据段组成

线程:进程可以进一步细化为线程,是程序内部的一条执行路径,线程是独立调度和执行的最小单位 ,线程可以显著提高程序运行效率但也会带来安全隐患;具有以下优点:①提高cpu的利用率(不让CPU闲着)②提高用户响应(多线程可以使用户每一次操作都会立刻得到响应,单线程就要一个个来)③改善程序结,将长而复杂的代码划分成多个线程,独立运行,利于理解和修改。

并发:宏观上看是同时发生的但微观上看还是有先后顺序的,如老渣上午和女1约会下午和女2约会
并行;多个事物同时进行,如小渣同时和多个女生约会

单核与多核概念:代表计算机有几个处理器,其中这两种都可以实现并发但是单核CPU其实是一种假的多线程当然也无法真正实现多线程,但是如果速度足够快快到任何事物都是一瞬间完成那么给人一种多线程的错觉,只有多核cpu才能更好的发挥多线程的效率;

扩展:一个java应用程序java.exe至少有3个线程,main()主线程,GC()垃圾回收线程,异常处理线程exception,因为main主线程执行的过程中异常和垃圾处理是要伴随执行的,即三者之间必须是并发执行的;main是用户线程,GC和异常处理是守护线程,守护进程是不能单独存在的,用户线程执行完毕守护线程也会随之结束;

进程与线程的关系

①一个进程可以创建或撤销一个线程,而一个进程的多个线程可以并发执行②相比于进程,线程接近于执行体的概念,同一个进程的线程可以共享该进程的资源,且线程拥有独立的栈空间和执行序列。总之进程是资源分配的单位,而线程是执行的基本单位
③一个程序至少一个进程,一个进程至少一个线程
④进程与线程主要的差别是不同的OS级的资源管理方式,由于进程有独立的地址空间,一个进程出现问题基本不会影响其它进程,线程没有自己独立的空间,线程相关的东西都在它所在的进程中,正是这一特征极大提高了程序和cpu的运行效率。但一个线程出现问题也会导致整个进程都会死亡,同时一个进程内的多个线程同时操作一类资源(共享资源),就会产生死锁,重复读,错读等安全隐患,线程的安全问题本质上都是由共享资源时引起的
⑤进程切换的资源和时间耗费远大与进程的切换

以下情况只能用多线程:
①当需要同时执行并且共享某些变量是就只能用多线程而不能用多进程,其中最典型的是java程序的运行必备三个线程mian.gc.excptionHandler(线程分为用户进程与守护线程,main是典型的用户线程,而gc是典型的守护线程,用户线程执行完毕后守护线程也会消失,即兔死狗烹)三个线程
②程序需要实现一些需要等待的任务时,如等待用户输入,如果不用多线程那么此时程序会进入阻塞状态,别的用户请求就无法顾及,此时只能使用多线程
③一个程序需要运行多个任务时(非常常见,如360同时进行电脑体检,开机优化,木马查杀…)
④需要运行一些后台的程序,
总之:多进程的程序比多线程的程序安全性更高当然与之相应的是性能差,线程不是开启的越多越好,当cpu与线程一对多时同时执行反而不如单个执行执行多次速度快,因为此时cpu的处理能力是一定的但是需要在多线程间来回切换,需要一些后台运行的程序,如java.exe后台运行的gc线程;

从JVM的角度分析线程的优缺点

JVM以进程为单位进行分配,被分配的内存结构如下图所示;
在这里插入图片描述

1 提高运行效率 一个进程中多个线程共享相同的内存空间(线程本身就在进程的空间中),这样使线程之间的交互变得简洁高效,而不同的进程需要不断的进行地址切换过程很繁琐,多线程效率远高于多进程
2 独立的调度与执行的最小单位虽然多个线程共享一个进程的地址空间,但是每个线程有各自独立的虚拟机栈程序计数器(PC)寄存器,多线程的程序效率是非常高的,我们还可以使用线程池进一步优化程序性能
3 线程容易产生安全问题 线程在进程的地址空间中并没有独立的方法区.即多线程之间共享一个方法区和堆,这样对于一个共享数据被多个线程操作且当前操作未完成时就进来一个线程,就会产生线程安全问题;

推荐学习:java线程的生命周期

猜你喜欢

转载自blog.csdn.net/wwwwwww31311/article/details/113360420