多线程中的几个概念
1、 线程的进程的区别
1 2 3 4 5
| 每个正在运行系统上运行的程序都是一个进程。每个进程中包含一到多个线程。
线程是一组指令的集合,或者是程序的特殊段,它可以在程序中独立执行。也可以把它理解为代码运行的上下文。因此线程基本上是轻量级的进程,它负责在单个程序中执行多任务。
进程是所有线程的集合,每一个线程是进程中的一条执行路径。
|
2、 并发(Concurrency)和并行(Parallelism)
1 2 3 4 5 6
| 无论是单CPU还是多CPU,操作系统都营造出了同时运行多个程序的假象。实际的过程是CPU的快速切换。
并发和并行都是多个进程同时运行。
并发说的是在一个时间段内,多件事情在这个时间段内交替执行。 并行说的是多件事情在同一个时刻同事发生。
|
3、 同步(Synchronous)和异步(Asynchronous)
1 2 3 4 5
| 线程同步是多个线程访问同一资源,等待资源访问结束,浪费时间和CPU,效率低。 - 同步方法调用开始后,调用者必须等到方法调用返回后,才能继续执行之后的方法。
线程异步是访问资源是在空闲等待是同时访问其他资源 - 异步方法调用更像是一次消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续执行之后的方法
|
4、 阻塞和非阻塞
1 2 3
| 阻塞和非阻塞通常用来形容很多线程间的相互影响。 一个线程占用了临界区资源,其他需要该资源的线程必须等待,等待会导致线程挂起,这种情况就是阻塞。 非阻塞就是没有一个线程可以妨碍其他线程执行,所有的线程都会尝试不断向前执行
|
5、 死锁(Deadlock)
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 死锁的概念 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。 若无外力作用,它们都将无法推进下去。 此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
# 产生的条件 1、 互斥条件 2、 请求和保持条件 3、 不剥削条件 4、 环路等待条件
如何避免死锁
|
6、 饥饿(Starvation)
1 2
| 饥饿是指某一个或者多个线程因为种种原因无法获得所要的资源。 比如:线程优先级太低
|
7、 活锁(Livelock)
1
| 活锁是主动将资源释放给他人使用,那么久会导致资源不断地在两个线程间跳动,而没有一个线程可以同时拿到所有资源正常执行
|
8、 临界区
9、 用户线程和守护线程
1 2
| 用户线程是指一个普通的线程,比如main程序 守护线程是指用来服务于用户线程,不需要上层逻辑介入,比如GC
|
10、上下文切换
1
| CPU通过时间片分配算法来循环任务,当前任务执行一个时间片会切换到下一个任务,但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
|