Java并发程序设计(一) 基础概念
一、必须知道的几个概念
一)同步(Synchronous)和异步(Asynchronous)
同步:同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。
异步:一旦开始,方法调用就立即返回,调用者就可以继续后续的操作。
二)并发(Concurrency)和并行(Parallelism)
共同点:都可以表示多个任务一起执行。
并发:偏重于多个任务交替执行,多个任务之间还可能是串行的。
并行:同时执行。
三)临界区
一种用来存储公共资源或者共享数据的区域,可以被多个线程使用。但每一次只能有一个线程使用它。
四)阻塞(Blocking)和非阻塞(Non-Blocking)
– 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要
这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如
果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。
– 非阻塞允许多个线程同时进入临界区
五)死锁、饥饿和活锁
死锁:
饥饿:指某一个或者多个线程因为某种原因无法获得所需要的资源,导致一直无法执行。
活锁:让路的例子。
二、并发的级别
一)阻塞
当一个线程进入临界区后,其他线程必须等待该线程释放资源。
二)非阻塞
1)无障碍
– 无障碍是一种最弱的非阻塞调度
– 自由出入临界区
– 无竞争时,有限步内完成操作
– 有竞争时,回滚数据
可以通过一致性标记来实现。
2)无锁
– 是无障碍的
– 保证有一个线程可以胜出
3)无等待
– 无锁的
– 要求所有的线程都必须在有限步内完成
– 无饥饿的