同步和异步,线程和进程,并发和并行,临界资源,阻塞,死锁,饥饿,活锁,线程的并发级别
◆
同步和异步
◆
同步就好比打电话,通信双方,你一句我一句,一句话得不到回应就会一直问:“喂?喂?可以听到么?是不是信号不好呀”。
异步就像发短信,发完短信我就去干点别的,看个视频、玩个游戏、干啥都行,等对方给我回信息了我再来处理短信(也可以不处理)。
◆
线程和进程
◆
进程的概念听起来很抽象,不大好理解。但是我知道你肯定认识这个东西,请看下图:
上方这些占用我的电脑CPU、内存、磁盘、网络的这些就都是进程。
那什么是线程呢?线程可以理解成是在进程中独立运行的子任务。比如微信运行时就会有很多的子任务在同时运行。比如,视频线程、下载线程、表情线程、语言线程等。简单来说,一组线程互相协作完成某一个程序的一些功能供我们使用。
◆
并发和并行
◆
-
并发和并行乍一看好像是一种东西,但是实际上区别很大。并发表示的是交替做不同事情的能力,而并行表示的是同时做不同事情的能力。例如你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这就是并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这是并行。
-
我们常说的高并发系统就是说的并发而不是并行。
-
并不是所有的系统都可以实现并行,因为一个CPU一次只能执行一条指令,所以想要实现并行必须是多核才可以
◆
临界资源
◆
临界资源:是一次仅允许一个进程使用的共享资源。例如公共电话,一次只能一个人使用
临界区:每个进程中访问临界资源的那段代码叫做临界区。例如使用公共电话的人
◆
阻塞
◆
线程在试图执行代码前,会试图获取临界区的锁,如果得不到,线程就会被挂起等待,从而形成阻塞。
◆
死锁
◆
多个线程循环等待它方占有的资源而无限期地僵持下去的局面。例如两个人想要使用公共电话打电话,结果一个人抢到了话筒,一个人拨了号。两个人谁也不让谁,就会无休止地等下去从而引起死锁。
死锁产生的四大必要因素:
-
互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
-
占有且等待:一个进程本身占有部分资源,同时还有资源未得到满足,正在等待其他进程释放该资源。
-
不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
-
循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
当以上四个条件都满足时才会发生死锁,所以想要避免死锁只要能破坏上方四个条件的任意一个都可以。
◆
饥饿
◆
线程因为优先级或其他原因始终无法获取到临界资源。例如A在使用公用电话在打电话,B来了之后在后面排队。之后C来了,一看认识A,好么,哥们你打完我来。然后D来了,他认识C。。。就这样B一直等待从而引起饥饿。
◆
活锁
◆
多个相互协作的线程为了彼此间的响应而相互礼让,使得没有一个线程能够继续前进,那么就发生了活锁。例如两个人在一个很宅的胡同里。一次只能并排过两个人。两人比较礼貌,都要给对方让路。 结果一起要么让到左边,要么让到右边,结果仍然是谁也过不去从而引起的活锁。
◆
线程的并发级别
◆
-
阻塞:参见上方阻塞的定义
-
无饥饿:对比上方的饥饿,如果设置所有线程的优先级相同,则任何想要获取资源的线程都要排队,那么所有的线程都有机会执行。
-
无阻塞:所有线程一起修改临界资源,修改完成后读取该资源是否被其他线程修改,如被其他线程修改则进行回滚,然后进行重试。
-
无锁:前面说的无阻塞是指所有的线程都能进入临界区,但如果发生了竞争,线程发现自己的数据每次去操作总是跟其它线程产生冲突,它就会不停地重试,如果在临界区当中有10个线程,线程1修改了部分数据,结果它被线程2干扰了,线程2又被线程3干扰,依此类推,最后线程1它又可能去干扰线程10,如果它们之间是彼此干扰的,最终会导致所有的线程都卡死在里面。而无锁在无阻塞的基础上加一个了约束,保证在竞争当中有一个线程是必然能够胜出的,这样就能保证在临界区的线程当中至少有一个是能顺利走出去的。当第一个线程走出去之后,就有第二个线程、第三个线程、等所有的线程都能走出去
-
无等待:无等待相比于无锁更进一步,它保证所有线程能进并且至少有一个线程能出来的同时还要求所有进入临界区的线程都能够在有限步当中完成其操作。
相关推荐
计算机后端-Java-Java核心基础-第20章 多线程 02. 复习:IDEA使用与多线程基本概念.avi
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
#### 一、多线程基本概念与目的 多线程技术是现代编程中的一项重要技术,尤其是在Java这样的面向对象语言中更是广泛应用。多线程能够显著提高程序的执行效率和响应速度,尤其是在多核处理器环境下。根据给定的文件...
#### 一、多线程基本概念与原理 多线程是计算机编程中的一个核心概念,它允许在一个程序中同时执行多个任务或子任务,从而提高程序的效率和响应性。在按键精灵(AutoIt)这样的自动化脚本工具中,多线程的应用尤为...
1. **多线程基本概念**: - 线程是一个程序内部的顺序控制流,它没有独立的执行,必须依附于程序。在Java中,线程由`java.lang.Thread`类表示。 - 相比进程,线程在同一个程序内共享内存空间和资源,拥有更小的...
一、多线程基本概念 多线程是指在一个进程中创建多个执行流,每个线程都有自己的栈空间,共享进程的全局变量和打开的文件描述符。线程间通信和同步是多线程编程中的关键问题,防止数据竞争和死锁是实现高效并发的...
#### 多线程基本概念 多线程是指在一个程序中同时执行多个线程的能力,每个线程都可以独立地执行代码路径。这使得程序可以在不同任务之间并行工作,从而提高整体性能和响应速度。在多核处理器的环境下,多线程的...
一、多线程基本概念 1. 线程:线程是操作系统调度的基本单位,每个线程都有自己的程序计数器、系统栈和局部变量,但共享同一块内存空间,这使得线程间的通信更为便捷。 2. 并发与并行:并发是指在同一时间段内执行多...
#### 一、多线程基本概念 - **进程**: 当一个程序开始运行时,它就是一个进程。进程包括运行中的程序以及该程序所使用的内存和系统资源。 - **线程**: 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(如...
多线程基本概念和实现 第7章 多线程ppt课件(全)主要介绍了多线程的基本概念和实现方式。多线程是指在一个程序中可以同时执行多个代码块,使程序执行更加流畅,可以达到处理多任务的目的。 多线程的基本概念...
#### 多线程基本概念 - **线程定义**:线程是程序中能独立运行的基本单位,也是操作系统分配CPU时间的基本单位。在多线程环境下,程序可以同时执行多个任务,极大地提高了程序的效率和响应速度。 - **单线程与多线程...
#### 二、多线程基本概念 **1. 进程与线程的概念** - **进程**: 进程是操作系统中的一个执行实例,拥有自己独立的内存空间、代码、数据和其他资源。 - **线程**: 线程是进程内部的一个执行单元。当进程启动时,会...
### 多线程基本概念 多线程是一种软件技术,允许一个程序在同一时间执行多个任务或线程。在多核处理器环境中,这种技术尤为重要,因为它可以充分利用硬件资源,提高程序的并行性和响应速度。 ### 多核编程基础 ##...
#### 一、多线程基本概念 ##### 进程 当一个程序开始运行时,它就是一个**进程**。进程不仅包含了正在运行的程序本身,还包括了该程序所使用的内存和系统资源。简单来说,进程是操作系统分配资源的基本单位。 ####...
1. **多线程基本概念**:Python中的多线程允许同时执行多个代码块,这在处理多个任务时非常有用。Python的`threading`模块提供了创建和管理线程的功能。每个线程都有自己的独立运行栈,但共享同一全局命名空间,因此...
1. **多线程基本概念**: - **线程**:线程是操作系统分配CPU时间的基本单元,一个进程中可以有多个线程执行不同的任务。 - **进程**:进程是资源分配的最小单位,包含一组线程,拥有独立的内存空间。 - **线程...
7.1 多线程基本概念 多线程是指在一个进程中同时存在多个执行线程,它们共享同一块内存空间和系统资源。相比于传统的单线程进程,多线程可以提高程序的并发性,使得在多处理器系统中可以更好地利用硬件资源,提升...
在Java编程中,多线程是一个核心概念,特别是在大型应用程序和服务器端开发中,多线程技术能实现程序的并发执行,提高资源利用率和系统效率。本文将深入探讨在JDK中新增Java.util.concurrent(JUC)包之前的Java多...