Java 阻塞非阻塞 同步异步的理解

同步和异步站在任务调度者看任务之间有无顺序关系;

任务调用者调用的操作跟任务调用者自身的操作不是顺序(同步)的操作,这个调用就是异步的操作。异步操作背后的实现往往采用多线程(看语言对任务的封装粒度)。

阻塞和非阻塞是站在CPU角度看内设(cpu和内存)和外设之间的速度匹配上差距产生的认识。

阻塞与非阻塞是站在CPU角度来看的。计算机各个部件的运行速度是不一样的,其中CPU速度最快。早期CPU与内存速度是一致的,访问内存并不需要额外等待,这里把CPU与内存视为一个整体作为计算机的内部系统——内设。而其它设备——外设的运行速度就很慢了。
当计算机要做的下一个事情不是仅在内设中就能直接处理的,需要外设的参与时,CPU会将事情交给外设去做。如果内设等待慢腾腾的外设处理完成并返回结果后才接着做后边的事情,这种模式就是阻塞模式,会让出CPU,压测时的表现就是CPU会突然掉下来;反之CPU将事情交给外设之后,内设就直接去做后边的事情不等待,这种模式就是非阻塞模式。所以阻塞与非阻塞发生的场景就是内设与外设交互之时。
内设与外设的交互往往被抽象为IO,所以阻塞与非阻塞几乎总是伴随IO出现(但这不是必须的)。

代码层面

阻塞:无回调; 非阻塞,有回调;
同步:同一个线程执行;异步,两个线程执行;

在这里插入图片描述

对于socket流而言,数据的流向经历两个阶段:

第一步通常涉及等待网络上的数据分组到达,然后被复制到内核的某个缓冲区。
第二步把数据从内核缓冲区复制到应用进程缓冲区

猜你喜欢

转载自blog.csdn.net/liuqianduxin/article/details/84329979