网站首页 > 技术文章 正文
引言:本文将深入探讨这些I/O操作的核心概念,通过生活中的比喻,将抽象的技术术语转化为易于理解的日常场景。我们将一起探索同步与异步的通信机制,理解它们如何在不同的情境下发挥作用,以及阻塞与非阻塞如何影响程序的执行流程。通过这些深入浅出的解析,我们希望能够帮助读者更好地理解I/O操作的本质,从而在编程实践中做出更明智的选择。
题目
同步、异步、阻塞、非阻塞的IO的区别?
推荐解析
同步和异步概念
同步和异步关注的是消息通信机制。
同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。
生活举例
同步:在人工咖啡店点咖啡,排队等待服务员制作完成,等制作完成之后,才能进行下一步行动。
异步:自助咖啡机等咖啡,可以在等咖啡时做其他事情,例如玩手机,读杂志。
同步的举例很明显现在已经被优化了,因为同步的对人为感觉明显不好,异步更为舒适。
阻塞和非阻塞概念
阻塞和非阻塞关注程序在等待调用结果时的状态。
阻塞:被调用者接受到任务请求,会挂起当前线程,执行任务请求,直到完成,然后返回给调用者。
非阻塞:被调用者,先做完其他的事情,然后开始做调用者的任务请求,不会阻塞当前线程。
生活举例
阻塞:交通拥堵的交通路口等待红绿灯,只有交通信号灯变绿才能继续前行,车辆被阻塞。
非阻塞:当你在等待电梯,此时电梯在其他楼层,采用非阻塞方式,可以采用楼梯代替电梯。
Java 代码举例
同步阻塞I/O(BIO)
import java.io.FileInputStream;
import java.io.IOException;
public class SyncBlockingIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt")) {
int data;
while ((data = fis.read()) != -1) {
// 处理数据
System.out.print((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
同步非阻塞I/O
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class SyncNonBlockingIOExample {
public static void main(String[] args) throws Exception {
FileChannel channel = FileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (channel.read(buffer) != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
// 处理数据
System.out.print((char) buffer.get());
}
buffer.clear();
}
channel.close();
}
}
异步I/O(AIO)
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousFileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.Future;
public class AsyncIOExample {
public static void main(String[] args) throws Exception {
AsynchronousFileChannel channel = AsynchronousFileChannel.open(Paths.get("example.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
Future<Integer> result = channel.read(buffer, 0);
while (!result.isDone()) {
// 执行其他任务
}
buffer.flip();
while (buffer.hasRemaining()) {
// 处理数据
System.out.print((char) buffer.get());
}
buffer.clear();
channel.close();
}
}
区别详解
同步I/O
1)定义:同步I/O是指程序发起一个I/O操作后,必须等待该操作完成并获取到结果后,才能继续执行后续代码。
2)特点:同步I/O操作会阻塞程序的执行,直到I/O操作完成。这意味着程序在等待I/O操作期间不能执行其他任务。
3)示例:在Java中,使用java.io包中的FileInputStream或FileOutputStream进行文件读写就是同步I/O的例子。
异步I/O
1)定义:异步I/O是指程序发起一个I/O操作后,不需要等待该操作完成,而是可以继续执行后续代码。I/O操作完成后,程序会通过回调、事件或轮询等方式得到通知。
2)特点:异步I/O不会阻塞程序的执行,允许程序在I/O操作进行的同时执行其他任务,提高了程序的并发性和效率。
3)示例:在Java中,使用java.nio.channels.AsynchronousFileChannel进行文件读写就是异步I/O的例子。
阻塞I/O
1)定义:阻塞I/O是指程序发起一个I/O操作后,如果数据尚未准备好(如数据未到达、文件未找到等),程序会一直等待,直到数据准备好并完成I/O操作。
2)特点:阻塞I/O会导致程序的执行线程被挂起,直到I/O操作完成。在这期间,线程不能执行其他任务。
3)示例:在Java中,使用java.io包中的Socket进行网络通信时,InputStream.read()方法就是阻塞I/O的例子。
非阻塞I/O
1)定义:非阻塞I/O是指程序发起一个I/O操作后,如果数据尚未准备好,I/O操作会立即返回一个错误或特定值,而不是等待数据准备好。
2)特点:非阻塞I/O允许程序在数据未准备好时继续执行其他任务,而不是等待。程序通常需要轮询或检查I/O操作的状态,以确定何时数据准备好。
3)示例:在Java中,使用java.nio包中的SocketChannel设置为非阻塞模式,并使用read()方法进行网络通信,就是非阻塞I/O的例子。
其他补充
鱼聪明 AI 的回答:
鱼聪明 AI 地址:https://www.yucongming.com/
- 同步IO:当程序发起IO操作时,程序会一直等待IO操作完成后才能继续执行后续操作,这种IO称为同步IO。
- 异步IO:程序发起IO操作后,不需要等待IO操作完成,而是继续执行后续操作,当IO操作完成后通过回调等方式通知程序,这种IO称为异步IO。
- 阻塞IO:程序发起IO操作时,如果IO操作无法立即完成,程序会一直等待IO操作完成或出错后才能继续执行后续操作,这种IO称为阻塞IO。
- 非阻塞IO:程序发起IO操作时,如果IO操作无法立即完成,程序会立即返回一个错误码或结果,然后继续执行后续操作,通过轮询等方式可以判断IO操作是否完成,这种IO称为非阻塞IO。
总结:
- 同步IO和异步IO是根据程序等待IO操作完成的方式来区分的。
- 阻塞IO和非阻塞IO是根据程序在等待IO操作完成时是否能继续执行其他操作来区分的。
欢迎交流
阅读完本文,你应该对 IO 三种模型,Java 如何使用 IO 进行读取,有了一定的了解,本文是面试的重点问题之一,需要重点学习,在文末还有三个问题,欢迎小伙伴在评论区留言!
1)在实际的编程应用中,你更倾向于使用同步IO还是异步IO?为什么?
2)阻塞IO和非阻塞IO在网络编程中有何区别?你在开发网络应用时如何选择适合的IO模型?
3)在并发编程中,如何处理IO操作的性能问题?有没有什么优化策略可以提升IO操作的效率?
猜你喜欢
- 2024-10-21 面试官:NIO非阻塞网络编程原理了解吗?一文深度讲解避坑
- 2024-10-21 Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
- 2024-10-21 超详细的I/O多路复用概念、常用I/O模型、系统调用等介绍
- 2024-10-21 非阻塞同步算法与CAS(比较和交换)无锁算法 - 美因茨
- 2024-10-21 为什么要学IO模型(同步阻塞,异步非阻塞)?
- 2024-10-21 非阻塞同步机制和CAS 治疗青光眼的药物中,降压机制是使阻塞房角开放的是
- 2024-10-21 一文彻底搞定(阻塞/非阻塞/同步/异步)网络IO、并发编程模型
- 2024-10-21 一文搞懂什么是阻塞IO、信号驱动IO、Reactor模型、零拷贝
- 2024-10-21 Java面试常见问题:阻塞与非阻塞,同步与异步
- 2024-10-21 聊聊Java BIO(同步阻塞IO)、NIO(非阻塞IO)、AIO(异步IO)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)