同步和异步,阻塞和非阻塞,到底区别在哪里

这个问题由来已久,翻过很多博客,看到过各种各样的解释。

但我知道你不喜欢看大段的文字,手痒画了几张图,希望能给大家解惑。

同步和异步

同步和异步,阻塞和非阻塞,到底区别在哪里

稍微解释下。。
我认为,同步和异步的根本区别就是,目标方法是不是在当前线程上执行的。

  1. 同步:目标方法在当前线程上执行,会占用当前线程的执行时间
  2. 异步,是把目标方法交给另一个线程去执行。最简单的办法就是new一个Thread去做这个事情了,或者不管什么方式,只要通知到另外一个线程去做某件事,这就是异步了。

阻塞和非阻塞

这和同步异步完全不是一回事,描述的不是一个阶段的东西。这两个词经常用来描述结果获取。

同步和异步,阻塞和非阻塞,到底区别在哪里

  1. 阻塞:当前线程调用某个方法想做某件事,但是如果条件暂不满足,可能会导致当前线程进入非Running状态(比如Wait/Sleep/Park),直到发生了另外一件事情(比如超时,或者接到另一个线程的通知,或者获得锁),才能终止这种非运行状态,完成想做的事情,这就是阻塞。
  2. 非阻塞:当前线程调用某个方法想做某件事,但是如果条件暂不满足,方法会立即退出并”Say NO!”,表示无法完成,这就是非阻塞。有时候,当前线程会持续不断地调用这个方法,直到最终成功。

其他

最近看到一篇博客,讲的是计算机内核的各种I/O复用机制,很不错,推荐给大家:
再谈select, iocp, epoll,kqueue及各种I/O复用机制