同步与异步 Link to heading

同步:同步的方法调用,必须等到方法执行完毕返回后,调用方才会继续向后执行。 异步:异步的方法调用,立即返回,被调用的方法在独立的线程中执行,执行完后可以回调调用方,所以异步调用类似于消息通知。

并发与并行 Link to heading

并发:多个任务交替执行,时间上还是顺序发生的。 并行:多个任务同时执行,时间上也是同时发生的。

单CPU系统里的多进程或多线程实际上都是并发的,而不是并行的,只有在多CPU系统里才会有真正的并行。

临界区 Link to heading

临界区表示一种公共资源或共享数据,可以被多个线程使用,但每一次只能被一个线程使用。如果已经有线程在使用临界区资源,其它线程只能等待。

阻塞与非阻塞 Link to heading

阻塞与非阻塞通常用于形容线程间的相互影响。如果多个线程竞争临界资源,未获取到使用权的线程就会等待,线程挂起,处于阻塞状态。

非阻塞表示没有线程会妨碍其它线程的执行,所有线程都会尝试不断向前执行。

死锁、饥饿与活锁 Link to heading

死锁:多个线程,每一个线程既不放弃已占有的共享资源,同时尝试获取其它线程的资源,导致都无法向后执行。

饥饿:一个或多个线程因为种种原因无法获得需要的资源,导致一直无法执行。常见情况:

  • 低优先级的线程由于一直被高优先级线程抢占导致无法获取所需的资源
  • 某个线程一直占用关键资源不放,导致其它需要该资源的线程无法执行

活锁:相互协作的线程彼此响应从而修改自己的状态,导致都无法执行下去的情形。活锁中的资源在线程间不断跳跃,线程并未阻塞。常见的例子:电梯里外的两个人彼此礼貌左右避让,但每次都在同一侧相遇,导致一个没法进电梯,一个没法出电梯。