Java程序员面试笔试宝典(第2版)
上QQ阅读APP看书,第一时间看更新

2.2 同步与异步、阻塞与非阻塞

在IO体系中,经常能接触到同步阻塞、异步非阻塞等概念,往往使人疑惑,在多线程环境下,多线程不就是非阻塞的,单线程就是阻塞的吗?多线程不就是异步,单线程不就是同步吗?这种普遍的疑惑,事实上是由于概念的不清晰造成的。

多线程、单线程、同步、异步、阻塞、非阻塞,都是独立的概念,只是在多数应用场景下,它们看上去一致,所以造成了概念的混淆。

(1)在多线程语境下的概念

在多线程语境下,用于描述任务的线程访问执行机制,同步和异步关注的是任务是否可以同时被调用,阻塞和非阻塞则关注的是线程的状态。

1)同步:指代码的同步执行(Synchronous Invoke),一个执行块同一时间只有一个线程可以访问;

2)异步:指代码的异步执行(Asynchronous Invoke),多个执行块可以同时被多个线程访问;

3)阻塞:线程阻塞状态(Thread Block),表示线程挂起;

4)非阻塞:线程不处于阻塞状态,表示线程没有挂起。

(2)在IO语境下的概念

在IO语境下,用于描述IO操作,同步和异步关注的是消息发起和接收的机制,阻塞和非阻塞则是表达发起者等待结果时的状态。

1)同步:是指发起一个IO操作时,在没有得到结果之前,该操作不返回结果,只有调用结束后,才能获取返回值并继续执行后续的操作。

2)异步:是指发起一个IO操作后,不会得到返回,结果由发起者自己轮询,或者IO操作的执行者发起回调。

3)阻塞:是指发起者在发起IO操作后,不能再处理其他业务,只能等待IO操作结束。

4)非阻塞:是指发起者不会等待IO操作完成。

(3)并发与并行的区别

1)并发(Concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速地轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替地执行。

2)并行(Parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。