同步和异步都是针对两个参与者来说的,一个参与者为调用者A(比如主函数),一个参与者为被调用者B(比如被调用方法)
同步是指A调用B时,A必须等待B执行结束返回,才能继续执行。
异步是指A调用B后,B立即返回,A可以继续执行,待B执行完毕,将结果通知A。
并发实际上是多个任务交替执行,只不过切换的频率比较高,宏观上看起来是同时执行的。
并行是真正的多个任务同时执行。
如果只有一个CPU的话,只有并发,并没有实际的并行;多个CPU可以实现并行执行。
并发和并行的执行效果可能是一样的。
临界区是指包括了共享资源或者数据并且需要保护的部分。
阻塞和非阻塞通常用来形容多线程之间的互相影响。
比如如果一个线程占用了临界区资源,其他所有需要这个资源的线程必须在这个临界区中等待。
死锁,多个线程之间互相持有其他线程所需的资源,互不想让,互相等待。
饥饿,一个或多个线程由于种种原因始终得不到执行。比如优先级太低或者一个线程始终不释放公共资源,导致其他线程无法执行。
活锁,由于谦让,每个线程都主动释放资源,导致都无法得到所有所需的资源,导致无法执行。