一步步学习多线程(一) 重要概念

几个重要的概念

1、同步(synchronous)和 异步(asynchronous)

2、并发(Concurrency)和 并行(Parallelism)

3、临界区

4、阻塞(Blocking)和非阻塞(Non-Blockings)

5、死锁(DeadLock)、饥饿(Starvation)和活锁(LiveLock)

6、并行的级别


1、同步和异步

    对方法调用而言,如果是同步的,对于时间轴上,同步的调用会等待返回的结果。异步的调用会立即返回,但此返回并不是结果,调用的请求会在另一个线程中工作,过一段时间把数据返回。


2、并发和并行

   并行表示同一时间,多个线程同时工作;并发表示在一段时间内,多个线程排队进行工作,同一时间只能有一个线程进行工作。目前多核CPU的情况下,基本都是并行工作的。下图左侧为并发,右侧为并行

                  

3、临界区

   临界区用来表示一种公共资源,可以被多个线程访问,但是每一次只能有一个线程使用它,临界区一旦被占用,其他线程想要使用这个资源,就必须等待。

4、阻塞和非阻塞

   阻塞和非阻塞用于形容多线程间的互相影响。例如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中等待,等待会导致线程挂起,这种情况就是阻塞,可以理解成高架的出口经常发生阻塞。

  非阻塞允许多个线程同时进入临界区

5、死锁、饥饿和活锁

   死锁表示进程之间相互制约导致均无法进行工作,如下图所示。

饥饿表示某个进程一直无法获得需要的资源,导致无法执行。

活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

生活中的典型活锁例子: 两个人在窄路相遇,同时向一个方向避让,然后又向另一个方向避让,如此反复。


并发级别:

阻塞、非阻塞(无障碍、无锁、无等待)

1)阻塞:当一个线程进入临界区,其他线程都必须等待;

2)无障碍:最弱的非阻塞调度,自由进入临界区,无竞争时,有限步内完成动作;有竞争时,回滚数据(宽进严出)

3)无锁:所有线程能进入临界区,保证有一个线程可以胜出(每一竞争一个胜利者)

4)无等待:无锁;要求所有的线程都必须在有限步完成;无饥饿的;



猜你喜欢

转载自blog.csdn.net/money9sun/article/details/80312246
今日推荐