欢迎来到军工软件开发人才培养基地——学到牛牛

线程的基本概念讲解

时间:2024-05-06 07:01:10 来源:学到牛牛

关于线程,最大的误区就是容易与进程混淆,因此首先要能区分两者的概念。再者就是关于线程的一些基本概念,当我们清楚了这些概念之后,对于我们代码的编写更加有利。比如:进程、线程、多线程、同步与互斥、互斥锁、信号量、条件变量、临界资源等。这些是我们学习线程必须知道和掌握的一些知识。

进程与线程的区别:

首先程序本身是静态的,比如计算机中后缀为exe的文件。而进程则是动态的,是运行程序时的状态。线程则是程序执行时的最小执行单位。比如我们可以同时下载多个任务,而每个任务都可以看作一个线程。

程序:

进程:

线程:

 

 

简单的定义如下:

进程:是一个动态的过程,是一个活动的实体,一段程序执行的过程;一个进程包括由操作系统分配的内存空间,包含一个或多个线程。

 

线程:在Unix下又称为轻量级进程(LWP:LightWeight Process),是程序执行流的最小单元。一个标准的线程由线程ID、当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程不拥有系统资源,近拥有少量运行必须的资源。

线程与多线程:

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。他们彼此之间交替执行,称为多线程。

简单来说,以上面的百度云为例:

程序是百度云,进程就是运行百度云这个软件。此时,进程之中至少包含一条线程,也可以同时包含多个线程(即多线程)。比如可以有一个或多个任务同时下载。

简而言之:程序运行的时候就是一个进程,且一个进程之中可以有一个或多个线程。

 

单线程:

 

多线程:

 

5.png

 

多线程同步与互斥:

提到多线程就不得不说线程的同步与互斥,关于两者的概念其实很简单。

线程同步:每个线程之间按预定的先后次序进行运行,协同、协助、互相配合。可以理解成“你说完,我再做”。线程同步,可以让每个线程协同完成某一件事。

 

线程互斥:当有多个线程访问同一块资源时,规定同一时间只能有一个线程可以得到访问权,其它线程需要等占用资源者(该线程)释放该资源才可以申请访问。线程互斥可以看成是一种特殊的线程同步。

而实现多线程同步与互斥的方法有很多,如下:

 

1.互斥锁:给临界资源上锁,以此来解决互斥的问题。上锁后其它线程将无法访问临界资源,直到解锁后其他线程才可使用。

临界资源:多线程执行时,都可访问的共享资源。

2.信号量:锁的另一种实现机制。得到信号量时,进程或线程再能进入临界区使用临界资源。

3.条件变量:用来等待线程,而不是上锁。条件变量常和互斥锁一起使用。

锁只有两种状态:锁定与非锁定。而条件变量可以通过允许线程阻塞和等待另一个线程发送信号,以此来弥补互斥锁的不足。

4.读写锁:可以多个线程同时读,但不能多个线程同时写,且有强读同步和强写同步两者策略。

在强读同步中,读者优先权更高,只要没有正在进行写的操作,读者就可以获取访问权限。

在强写同步中,写者优先权更高,读者只能等待正在执行或等待的写者完成之后才能读。

 

并且,在Java中互斥锁、读写锁、自旋锁都属于悲观锁,对应的还有乐观锁。

悲观锁:并发访问共享资源时,冲突概率可能非常高,所以在访问共享资源前,都需要先加锁。

 

乐观锁:在访问共享资源时,不用先加锁,修改完共享资源后,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作。

注:乐观锁解决冲突的重试成本非常高。