大部分情况下,同步就是阻塞的意思,异步就是非阻塞的意思。但是在某些条件下讨论,其实还是有区别的。
比如在讨论IO的时候,这几个概念确实是不一样的
在IO环境里
同步IO指的是,用户要全程参与这个IO过程,强调的是一个过程。
异步IO就是说,你发起IO请求后,剩下的不用管了,系统会自己在可以IO的时候就主动调用你的回调函数,也就是主动来通知你,然后把做IO操作,这个时候,你是不用去参与这个过程的,全部交给了操作系统
阻塞的意思很好理解,就是卡在那里一直等着回复。
非阻塞的意思就是不等待,发起请求后,就立马返回了,不去管IO到底完成了没。系统也不会主动来通知你。这个可以看出和异步IO就有很明显的区别了
那为什么说java的NIO,是同步非阻塞。就是说他虽然执行IO请求的时候,可以去干别的事情,但是还是要不断的去轮询系统是否可以进行IO操作了,如果可以,NIO就马上进行IO操作。看到没,这里NIO虽然不会被阻塞,但是你还是要主动去进行IO,所以整个IO过程你还得操心,这就是同步
异步的话就爽了,不需要全程参与这个过程,只要发起IO请求后,提供一个回调函数就行,系统准备好了,自动会来调用,不需要操心剩下的事情,是真正上的异步。
如果还不好理解,可以拿厨房做菜的例子说一下。
假如你正在炒菜,又要煮汤,这个时候,如果你放下炒菜,去煮汤,那这是阻塞了。
你既要负责炒菜,又要负责把汤煮好,这个煮汤的过程你要全程参与,这是同步。
如果你一边炒菜,把火点起来煮汤后,马上又去炒菜,不管那边煮汤的情况了。这是非阻塞
但是你为了汤不洒出来,还要时不时回头看一下汤(轮询),然后看到汤煮好了,马上又跑过去把汤端走这是同步非阻塞。也就是一心二用,一遍在干着手里的事情,你还要去操心汤好了没。
如果你炒菜,但是把火点起来煮汤后,你选择叫一个人帮你看着,煮好了之后让他端开。这个时候你不用管汤怎么样了,反正有人会帮你搞好,这是异步了,不需要去操心汤那边的事情了。