`

多线程基本概念

阅读更多

同步和异步,线程和进程,并发和并行,临界资源,阻塞,死锁,饥饿,活锁,线程的并发级别

 

同步和异步

 



同步就好比打电话,通信双方,你一句我一句,一句话得不到回应就会一直问:“喂?喂?可以听到么?是不是信号不好呀”。
异步就像发短信,发完短信我就去干点别的,看个视频、玩个游戏、干啥都行,等对方给我回信息了我再来处理短信(也可以不处理)。

 

 

线程和进程

 


进程的概念听起来很抽象,不大好理解。但是我知道你肯定认识这个东西,请看下图:



 

上方这些占用我的电脑CPU、内存、磁盘、网络的这些就都是进程。

 

那什么是线程呢?线程可以理解成是在进程中独立运行的子任务。比如微信运行时就会有很多的子任务在同时运行。比如,视频线程、下载线程、表情线程、语言线程等。简单来说,一组线程互相协作完成某一个程序的一些功能供我们使用。

 

并发和并行

 

  1. 并发和并行乍一看好像是一种东西,但是实际上区别很大。并发表示的是交替做不同事情的能力,而并行表示的是同时做不同事情的能力。例如你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这就是并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这是并行。

  2. 我们常说的高并发系统就是说的并发而不是并行。

  3. 并不是所有的系统都可以实现并行,因为一个CPU一次只能执行一条指令,所以想要实现并行必须是多核才可以

 

临界资源

 


临界资源:是一次仅允许一个进程使用的共享资源。例如公共电话,一次只能一个人使用

临界区:每个进程中访问临界资源的那段代码叫做临界区。例如使用公共电话的人

 

 

阻塞

 

 

线程在试图执行代码前,会试图获取临界区的锁,如果得不到,线程就会被挂起等待,从而形成阻塞。

 

死锁

 

多个线程循环等待它方占有的资源而无限期地僵持下去的局面。例如两个人想要使用公共电话打电话,结果一个人抢到了话筒,一个人拨了号。两个人谁也不让谁,就会无休止地等下去从而引起死锁。

 

死锁产生的四大必要因素:

  1. 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

  2. 占有且等待:一个进程本身占有部分资源,同时还有资源未得到满足,正在等待其他进程释放该资源。

  3. 不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

  4. 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

当以上四个条件都满足时才会发生死锁,所以想要避免死锁只要能破坏上方四个条件的任意一个都可以。

 

 

饥饿

 

线程因为优先级或其他原因始终无法获取到临界资源。例如A在使用公用电话在打电话,B来了之后在后面排队。之后C来了,一看认识A,好么,哥们你打完我来。然后D来了,他认识C。。。就这样B一直等待从而引起饥饿。

 

活锁

 

多个相互协作的线程为了彼此间的响应而相互礼让,使得没有一个线程能够继续前进,那么就发生了活锁。例如两个人在一个很宅的胡同里。一次只能并排过两个人。两人比较礼貌,都要给对方让路。 结果一起要么让到左边,要么让到右边,结果仍然是谁也过不去从而引起的活锁。

 

 

线程的并发级别

 

  1. 阻塞:参见上方阻塞的定义

  2. 无饥饿:对比上方的饥饿,如果设置所有线程的优先级相同,则任何想要获取资源的线程都要排队,那么所有的线程都有机会执行。

  3. 无阻塞:所有线程一起修改临界资源,修改完成后读取该资源是否被其他线程修改,如被其他线程修改则进行回滚,然后进行重试。

  4. 无锁:前面说的无阻塞是指所有的线程都能进入临界区,但如果发生了竞争,线程发现自己的数据每次去操作总是跟其它线程产生冲突,它就会不停地重试,如果在临界区当中有10个线程,线程1修改了部分数据,结果它被线程2干扰了,线程2又被线程3干扰,依此类推,最后线程1它又可能去干扰线程10,如果它们之间是彼此干扰的,最终会导致所有的线程都卡死在里面。而无锁在无阻塞的基础上加一个了约束,保证在竞争当中有一个线程是必然能够胜出的,这样就能保证在临界区的线程当中至少有一个是能顺利走出去的。当第一个线程走出去之后,就有第二个线程、第三个线程、等所有的线程都能走出去

  5. 无等待:无等待相比于无锁更进一步,它保证所有线程能进并且至少有一个线程能出来的同时还要求所有进入临界区的线程都能够在有限步当中完成其操作。


     
     

  • 大小: 54.3 KB
  • 大小: 171.6 KB
0
0
分享到:
评论

相关推荐

    计算机后端-Java-Java核心基础-第20章 多线程 02. 复习:IDEA使用与多线程基本概念.avi

    计算机后端-Java-Java核心基础-第20章 多线程 02. 复习:IDEA使用与多线程基本概念.avi

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java基本教程之多线程基本概念 java多线程教程

    多线程是Java中不可避免的一个重要主体。下面是对“JDK中新增JUC包”之前的Java多线程内容的讲解,JUC包是由Java大师Doug Lea完成并在JDK1.5版本添加到Java中的

    python多线程.rar

    python多线程基本概念,使用互斥锁同步线程,死锁和可重入锁,条件变量同步, 队列同步,线程间通信, 线程的合并和后台线程。

    5.7_2_硬件多线程的基本概念.abc

    5.7_2_硬件多线程的基本概念.abc

    java程序设计于开发 第七讲 多线程

    多线程基本概念 创建线程的方式 线程的生命周期及控制 线程的优先级及调度 多线程的互斥与同步 守护线程 (Daemon) 线程组 (ThreadGroup)

    深入浅出Win32多线程程序设计之基本概念

    深入浅出Win32多线程程序设计之基本概念,欢迎下载

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南...本书以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及相关工具。

    POSIX多线程程序设计.pdf

    本书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了一些高级话题,包括属性对象、线程私有数据和实时调度。此外,本书还讨论了调度的问题,并给出了避免错误和提高性能等问题的有...

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

    POSIX多线程程序设计

    本, 书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了, 一些高级话题,包括属性对象、线程私有数据和实时调度。此外,本书还讨论了调度的问, 题,并给出了避免错误和提高性能等问题...

    POSIX多线程程序设计 中文版

    本书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了题,并给出了避免错误和提高性等问题的有价值的建议。本书使用了大量注释过的实例来解释实际的概念,并包括Pthreads的简装索引和...

    java多线程编程实战指南 核心篇 代码

    《Java多线程编程实战指南(核心篇)》以基本概念、原理与方法为主线,辅以丰富的实战案例和生活化实例,并从Java虚拟机、操作系统和硬件多个层次与角度出发,循序渐进、系统地介绍Java平台下的多线程编程核心技术及...

    linux的多线程编程的高效开发经验

    其涉及的多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。条件操作有 5 种操作:创建,销毁,...

    C_C++ 多线程编程精髓_专栏.pdf.zip

    操作系统层面上关于多线程和多线程协作的接口原理,线程的基本概念及常见问题,线程的创建与使用,线程 ID 的用途及原理

    POSIX多线程程序设计中文版

    书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了 一些高级话题,包括属性对象、线程私有数据和实时调度。此外,本书还讨论了调度的问 题,并给出了避免错误和提高性能等问题的有...

    实验7-WinInet 与多线程编程

    (1)理解 WinInet API 的基本概念与操作流程。 (2)掌握使用 WinInet 编写程序的方法。 (3)掌握 MFC WinInet 类层次结构和编程方法。 (4)掌握多线程网络编程的方法。 WinInet 是 Windows Internet 扩展应用...

    C#多线程编程实战

    为了创建这样的应用程序,你需要学习...本书的目的是给你提供C#中多线程以及并行编程的详尽指导。我们将从基本概念开始,每章主题比前一章都有所拔高,最后展示了现实世界中的并行编程模式以及Windows商店应用示例。

    Linux的多线程编程的高效开发经验

    其涉及的多线程开发的最基本概念主要包含三 点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。条件操作有 5 种操作:创建,销毁,...

Global site tag (gtag.js) - Google Analytics