1.需要知道的概念
1. 同步(Synchronous)和异步(Asynchronous)
同步和异步通常用来形容方法的一次调用。同步方法调用,调用者必须等到方法结束后,才能执行后续行为。异步方法调用,调用者不用等到方法执行完毕,在进行后续行为,而且,只要调用异步方法,就会立即有返回。下图为异步和和同步区别。
2. 并发(Concurrency)和并行(Parallelism)
并发偏重于多个任务交替执行,多个任务之间可能是串行的,由于交替执行的频率很高,所以会以为是同时执行的。并行才是真正的“同时执行”。下图为并发和并行。
单核情况下,多进程和多线程只能是并发。真实的并行只可能出现在拥有多个CPU的系统中(比如多核CPU)。
3. 临界区
临界区用来表示一种公共资源或者是共享资源,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。
4. 阻塞和非阻塞
阻塞和非阻塞通常用来形容多线程间的相互影响。
5. 死锁、饥饿和活锁
死锁:线程间相互影响。
饥饿:线程长时间得不到资源。
活锁:线程相互礼让,都得不到资源。
2.并发级别
由于临界区的存在,必须控制并发,所以有并发级别。并发级别大致分为阻塞、无饥饿、无障碍、无锁、无等待几种。
阻塞:线程使用synchronized或重入锁时,线程级别为阻塞。其他线程获得资源,该线程会挂机,无法继续执行,直到得到资源为止。
无饥饿:线程调用会有优先级,当线程进行排队,高的优先级会进行插队,因此,低的优先级会总获得不到,无饥饿会使高优先级进行排队,先到先得。
无障碍:无障碍是最弱的非阻塞调度。无障碍级别会进入临界区,即使里边有线程。如果改变数据发生冲突,无障碍会进行回滚。
无锁:无锁时无障碍的。在无锁中,线程修改数据,如果无冲突,会退出,有冲突,会继续请求。无锁总能保证有一个线程会成功。要求有一个线程在有限的步骤内完成。
等待:是在无锁上更进一步的扩展。所有线程都必须在有限的步骤内完成。