几个并发概念

同步(Synchronous)和异步(Asynchronous)

共同点:

都是用来形容一次方法调用。

不同点:

同步方法调用:只要调用一开始,调用者必须等到方法调用返回后,才能继续后续的行为。

异步方法调用:更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。

并发(Concurrency)和并行(Parallelism)

共同点:

都可以表示2个或多个任务一起执行。

不同点:

并发:同时开始,但是不一定同时执行;偏重于多个任务交替执行,而多个任务之间可能还是串行的。
并行:是真正意义上的同时执行,是并发的一种特殊情况

如果把

  • CPU的内核理解为工人,通常为4个工人。
  • 线程理解为工作,通常有很多。

如果有40个工作,每个人分配10个工作(a:1-10,b:11-20,c:21-30,d:31-40);

如果工人a和b同时做工作1和11,那就可以说工作1和11是并行执行的;如果工人a做了一会儿工作1,又去做2,然后又做3...10,这样轮流进行,那就说工作1-10是并发执行的。

临界区

  1. 用来表示一种公共资源或者说是共享数据
  2. 可以被多个线程使用,但是,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。

阻塞(Blocking)和非阻塞(Non-Blocking)

共同点:用来形容多线程间的相互影响

阻塞:一个线程占用了临界区资源,其他所有需要这个资源的线程就必须在这个临界区中进行等待。等待会导致线程挂起,这种情况就是阻塞。

非阻塞:与阻塞相反,没有一个线程可以妨碍其他线程执行。

死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)

共同点:都属于多线程活跃性问题。如果发生了这几种情况,那么相关线程可能就不再活跃,也就说它可能很难再继续往下执行了。

死锁:几个线程之间环形链式占用下一个线程所需要的资源。

饥饿:指一个或多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如线程优先级可能太低;又或者某个线程一直占着关键资源不放,导致其他需要这个资源的线程无法正常执行。

活锁:就像在电梯门口进来的人和出去的人互相谦让;两个线程之前都主动将资源释放给对方使用,那么就会出现资源不断在2个线程之间跳动,而没有一个线程可以同时拿到所有资源而正常运行。

你可能感兴趣的:(几个并发概念)