总是说多线程到底多线程是什么

线程概念

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。通俗来说开凿一个山洞,单线程,只能从一端施工开凿,而多线程可以,从从两端,或者从中间开辟,然后再向两端开凿,这种方案,在效率上具有显著提升,并能加快工期完成。

线程发展

谈及线程的发展,其实是我们是在谈线程诞生的前因后果。

  1. 最开始的计算机,计算任务能力有限,只能一次性执行一个指令任务,例如输入1+1 得出结果为2,不输入则机器空闲,造成资源浪费以及低效处理任务
  2. 后来人们通过磁带批量写入任务,让计算机一次性执行多个指令任务,然而在发生诸如IO阻塞的时候,导致CPU暂停,也造成资源浪费
  3. 接着,人们引入进程概念,通过对不同进程分离独立的内存空间,利用CPU时间片段调度应用进程,阻塞的进程暂停执行,活跃的进程可以接着继续执行,但是这种在进程内部如果发生阻塞,也会造成后续的任务执行搁浅
  4. 紧接着,人们又引入线程概念,线程是系统进行运算的做小单位,当在进程中一个线程被阻塞的时候,其他线程仍然可以获取CPU时间片段继续执行任务
  5. 随着进程,线程的诞生,然而在单核处理器上,CPU处理任务仍然串行化的,随着多核CPU的不断推出,真正的并发迎来了

线程特征

  • 轻型实体

线程具有可独立的运行资源,可保证线程正常执行,相对于进程是轻量的,并且进程内切换线程也是非常快的

  • 独立调度和分派的基本单位

在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)

  • 可并发执行

在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。

  • 共享进程资源

在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

线程的原则性

使用线程必须保证程序的正确执行,因此使用线程必须遵守以下三个特性

  • 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行
  • 可见性:是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
  • 有序性:即程序执行的顺序按照代码的先后顺序执行。

线程和进程

区别

定义区别:

线程:是进程的一个实际运作单位,是CPU调度和分派的最小单位

进程:是具有一定独立功能的程序关于某个数据集合上的一次进行活动,是系统进行资源分配和调度的一个独立单位

角色区别:

线程:线程是系统调度的单位

进程:是系统资源分配的单位

资源共享区别:

线程:线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。

进程::进程之间不能共享资源

优点

线程:

  • 程序逻辑和控制方式简单。
  • 所有线程可以直接共享内存和变量等。
  • 线程方式消耗的总资源比进程方式少。

进程:

  • 每个进程互相独立,不影响主程序的稳定性,子进程崩溃不影响其他进程。
  • 通过增加CPU,就可以扩充性能。
  • 可以尽量减少线程加锁与解锁的影响,极大的提高了性能。

缺点

线程:

  • 每个线程和主程序共用地址空间,最大内存地址受限。
  • 线程之间的同步和加锁不易控制。
  • 一个线程的崩溃可能影响到整个程序的稳定性。

进程:

  • 逻辑控制复杂,需要和主程序交互。
  • 多进程调度开销大。

线程应用优势

  • UI线程和任务线程分开,主线程和逻辑线程分块,保证程序的稳定执行和交互体验,如安卓应用
  • 耗时任务通过异步线程执行,不阻塞当前任务,如异步通知,异步统计
  • 独立任务独立线程,保证任务的独立性,提高系统的吞吐率,如 Tomcat,每一个请求就是一次线程
  • 任务分割,通过多线程分割大任务,最后合并每个任务的结果,获取最终结果

线程面对挑战

  • 线程上下文切换开销

在单核处理下,CPU需要给线程分配时间片段执行任务,频繁的切换任务分配,会引起上下文切换,资源开销大

  • 死锁问题

死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。最终导致系统奔溃。

  • 线程安全问题

在不提供数据访问保护的前提下,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

  • 资源限制

资源限制主要指的是硬件资源和软件资源,在开发多线程应用时,程序的执行速度受限于这两个资源

本套教程是一套全面覆盖JAVA多线程的教程,其他章节可登陆网站查看
涵盖内容:包括但是不限制,线程基础理论,线程安全,锁,调度机制,线程通信,并发容器,并发框架,并发工具类,线程池,线程性能测试与问题定位

 多线程开发之前你必须了解的基本概念
Linux上安装Rust开发环境支持加速访问 
上一篇:多线程开发之前你必须了解的基本概念
下一篇:Linux上安装Rust开发环境支持加速访问
评论

如果我的文章对你有帮助,或许可以打赏一下呀!

支付宝
微信
QQ