我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者我可以吗?
但是如果我创建两个线程,每个线程分别处理read()和write()会怎么样呢?我不知道在低级视图中,read()和write()是否会获得套接字锁,因此一次只允许执行一个操作?会吗?
我使用Window作为平台,但也想知道Unix机器有什么不同吗?
我问这个问题是因为我很困惑,既然两个线程能够让我们同时读()和写(),为什么我们需要非阻塞IO?
发布于 2012-09-11 10:38:02
我知道对于一个线程(一个套接字),我不能同时执行read()或write(),或者我可以吗?
当然不是。一个线程一次只能调用一个方法。这个问题说不通。
但是如果我创建两个线程,每个线程分别处理
()和write()会怎么样呢?我不知道在低级视图中,read()和write()是否会获得套接字锁,因此一次只允许执行一个操作?会吗?
他们不需要锁。TCP是全双工的。你可以在同一个套接字上读写。在同一时间。
我用的是Window作为平台,但也想知道Unix机器有什么不同?
不是的。
我问这个问题是因为我很困惑,既然两个线程能够让我们同时使用
()和write(),为什么我们需要非阻塞IO?
做个决定吧。首先你问它是否可能,现在你(正确地)说它是可能的。
NIO允许您在同一线程中处理多个套接字。这样做的目的是保护线程,例如在必须处理数十万个连接的服务器中。
发布于 2012-09-11 10:37:53
线程是非常昂贵的资源。我们应该尽量节约和有效地使用它们,以最大限度地利用它们。
NIO允许我们在同一线程上打开多个套接字。基本上,您可以在单个线程上使用1000个套接字连接,而不是1000个线程。
让我们以Tomcat作为现实世界的一个例子。Tomcat是一个带有JSP/Servlet容器的JSP服务器。同时支持阻塞IO和非阻塞IO。在阻塞IO的情况下,它最多支持5K HTTP连接,但使用NIO时,如果有足够的RAM内存,它可以达到20K HTTP连接。
发布于 2012-09-11 10:28:24
因为创建数千个线程会给JVM和系统资源带来压力。有了异步IO,你可以用几个线程来监控大量的连接,这样效率会高得多。
https://stackoverflow.com/questions/12361877
复制相似问题