繁体   English   中英

Java IO是阻塞IO吗?

[英]Is Java IO a blocking IO?

我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者我可以吗?

但是如果我创建2个线程并且每个线程分别处理read()和write()怎么办? 我不知道在低级别视图中,read()和write()是否会获得套接字锁定,因此一次只允许执行一个操作? 会吗?

我使用Window作为平台,还想知道Unix机器有什么不同吗?

我问这个问题,因为我很困惑,为什么我们需要非阻塞IO,因为2个线程能够同时让我们read()和write()?

我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者我可以吗?

当然不是。 一个线程一次只能调用一个方法。 这个问题毫无意义。

但是如果我创建2个线程并且每个线程分别处理read()和write()怎么办? 我不知道在低级别视图中,read()和write()是否会获得套接字锁定,因此一次只允许执行一个操作? 会吗?

他们不需要锁。 TCP是全双工的。 您可以在同一个套接字上读写。 与此同时。

我使用Window作为平台,还想知道Unix机器有什么不同吗?

没有。

我问这个问题,因为我很困惑,为什么我们需要非阻塞IO,因为2个线程能够同时让我们read()和write()?

下定决心。 首先你问是否有可能,现在你(正确地)说出来了。

NIO允许您在同一个线程中处理多个套接字 这样做的目的是保护线程,例如在必须处理数十万个连接的服务器中。

线程是非常昂贵的资源。 我们应该尽量有效地使用它们来充分利用它们。

NIO允许我们在同一个线程上打开多个套接字。 基本上你可以在一个线程而不是1000个线程上使用1000个套接字连接。

让我们把Tomcat作为一个真实世界的例子。 Tomcat是一个带有JSP / Servlet容器的Web服务器。 它支持阻塞IO和非阻塞IO。 使用阻塞IO,它最多可以使用5K HTTP连接,但是对于NIO,当有足够的RAM内存时,它可以达到20K HTTP连接。

因为创建数千个线程会给JVM和系统资源带来压力。 使用异步IO,您可以让一些线程监视大量连接,并且效率更高。

对于一个线程(一个套接字),我不能同时执行read()或write(),

您可以同时读写,但可以在同一个线程中读写。 如果您希望编写已知数量的数据或消息,并且希望获得已知数量的数据或消息,则可以在同一个线程中编写然后读取。

例如,如果您有一个简单的服务器进程,您可以使用单个线程读取请求并写入响应。

我会使用阻塞IO不超过几百个连接。 如果您有数十个或更少的连接,非阻塞IO可能不值得额外的复杂性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM