首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java IO是阻塞IO吗?

Java IO是阻塞IO吗?
EN

Stack Overflow用户
提问于 2012-09-11 10:23:13
回答 4查看 333关注 0票数 2

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

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

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

我问这个问题是因为我很困惑,既然两个线程能够让我们同时读()和写(),为什么我们需要非阻塞IO?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-11 10:38:02

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

当然不是。一个线程一次只能调用一个方法。这个问题说不通。

但是如果我创建两个线程,每个线程分别处理

()和write()会怎么样呢?我不知道在低级视图中,read()和write()是否会获得套接字锁,因此一次只允许执行一个操作?会吗?

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

我用的是Window作为平台,但也想知道Unix机器有什么不同?

不是的。

我问这个问题是因为我很困惑,既然两个线程能够让我们同时使用

()和write(),为什么我们需要非阻塞IO?

做个决定吧。首先你问它是否可能,现在你(正确地)说它是可能的。

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

票数 5
EN

Stack Overflow用户

发布于 2012-09-11 10:37:53

线程是非常昂贵的资源。我们应该尽量节约和有效地使用它们,以最大限度地利用它们。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-09-11 10:28:24

因为创建数千个线程会给JVM和系统资源带来压力。有了异步IO,你可以用几个线程来监控大量的连接,这样效率会高得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12361877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档