同步与异步
同步与异步都是对于方法来讲的。如果一个方法是同步的,那么必须等到该方法执行完成后才能执行下面的代码,如果方法是一个异步方法,那么在执行该方法时会立即返回,这里并不是说该方法已经执行完成,而是单独去启动一个线程去执行,而后面的代码也不必等到该方法执行完成后在去执行。
并行与并发
并行是指单个线程或单个进程同时执行,发生在多个cpu中,并发是指在单个cpu中在不同的时间段处理不同的事,不能同时处理不同的事。
临界区
临界区用来表示一种公共资源或者是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用他,一点临界区被占用,其他的线程如果想要使用,那么这个线程就必须等待上一个线程释放。
阻塞与非阻塞
阻塞与非阻塞是对于线程来讲的,如果一个线程已经获得了临界去的资源时,其他线程也想进入临界去获取资源时,那么只能等待上一个线程操作完成后才能进入临界区,这个就叫阻塞。
非阻塞允许多个线程同时进入临界区。
死锁、饥饿、活锁
死锁:一个线程为获取不到资源而阻塞,对已经获得的资源保持不放,而导致其他需要该资源的线程获取不到资源也被阻塞,如此循环就叫死锁。
饥饿:指某一个或多个线程因为某种原因无法获得需要的资源,导致无法执行(线程优先级比较低)。
活锁:一个或多个线程为获取不到资源而阻塞,并释放已经获得的资源,再次获取资源时又获得了该资源,又一次阻塞,如此反复叫活锁。例如:线程A,线程B已经分别获得了A资源和B资源,此时线程A需要B资源,线程B需要A资源,导致线程A和线程B阻塞,这是这两个线程都释放资源,线程A释放A资源,线程B释放B资源,当线程A获得资源时又一次获得了资源A,线程B又一次获得了资源B,又一次阻塞,如此反复。
并行级
1.无障碍
是一种最弱的非阻塞调度
自由出入临界区
无竞争时,在有限步完成操作
有竞争时,回滚数据(在一个线程执行过程中,另一个线程修改了这个线程已经获取的资源,那么这个线程就会回滚重新去获取该资源才能继续下一步)
2.无锁
无障碍
保证一个线程可以胜出(保证一个线程在竞争中能够胜出)
3.无等待
无锁的
所有线程必须在有限步内完成
无饥饿的(所有线程都能执行完成) (案例写时复制:在写时拷贝一个副本,写线程就在这个副本操作,操作完成后覆盖原始数据,这样并不影响读线程)