Java 并发编程需要理清的几个概念:
1. 同步(Synchronous)和异步(Asynchronous)
拿调用一个方法为例:
同步方法调用就是调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的方法执行。
异步方法:更像是一个消息的传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。
2. 并发(Concurrency)和并行(Parallelism)
并发侧重于多个任务交替执行,而多个任务之间则有可能还是串行的。
并行则是真正意义上的同时执行。
3. 临界区
临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其它线程要想使用这个资源,就必须等待。
4. 阻塞(Blocking)和非阻塞(Non-Blocking)
阻塞的概念:
阻塞和非阻塞一般是指多个线程之间的相互影响。比如说一个线程占用了临界区的资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待。
等待就会导致线程挂起,这种情况我们就常称为阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
若一个线程是阻塞的,那么在其它线程释放资源之前,当前的线程是无法继续执行的。当我们在编程时使用synchronized关键字,或者重入锁时,我们得到的就是阻塞的线程。
无论是synchronized或者重入锁,都会试图在执行后续代码前,得到临界区域,如果得不到,线程则会被挂起等待,直到占有了所需要得资源为止。
非阻塞:
指没有一个线程可以妨碍其它线程都执行。
5. 死锁(Deadlock)、饥饿(Starvation)和活锁(LiveLock)
死锁一般是指都分别占用对方的资源没有释放。
饥饿一般是指一个或多个线程因为种种的原因无法获得所需要的资源,导致一直无法执行。比如它的线程优先级可能太低,而高优先级的线程不断抢占它需要的资源,导致低优先级线程无法工作。