我知道对于一个线程(一个套接字),我不能同时执行 read() 或 write(),或者我可以吗?
但是,如果我创建 2 个线程并且每个线程分别处理 read() 和 write() 怎么办?我不知道在低级视图中,read() 和 write() 是否会获得套接字锁,因此一次只允许执行一个操作?会吗?
我使用Window作为平台,但也想知道在Unix机器上有什么不同吗?
我问这个问题是因为我很困惑,为什么我们需要非阻塞 IO,因为 2 个线程能够让我们同时读取()和写入()?
我知道对于一个线程(一个套接字),我不能同时执行 read() 或 write(),或者我可以吗?
但是,如果我创建 2 个线程并且每个线程分别处理 read() 和 write() 怎么办?我不知道在低级视图中,read() 和 write() 是否会获得套接字锁,因此一次只允许执行一个操作?会吗?
我使用Window作为平台,但也想知道在Unix机器上有什么不同吗?
我问这个问题是因为我很困惑,为什么我们需要非阻塞 IO,因为 2 个线程能够让我们同时读取()和写入()?
我知道对于一个线程(一个套接字),我不能同时执行 read() 或 write(),或者我可以吗?
当然不是。一个线程一次只能调用一个方法。这个问题没有意义。
但是,如果我创建 2 个线程并且每个线程分别处理 read() 和 write() 怎么办?我不知道在低级视图中,read() 和 write() 是否会获得套接字锁,因此一次只允许执行一个操作?会吗?
他们不需要锁。TCP 是全双工的。您可以在同一个套接字上读取和写入。同时。
我使用Window作为平台,但也想知道在Unix机器上有什么不同吗?
不。
我问这个问题是因为我很困惑,为什么我们需要非阻塞 IO,因为 2 个线程能够让我们同时读取()和写入()?
下定决心。首先你问是否可能,现在你(正确地)说它是可能的。
NIO 允许您在同一个线程中处理多个套接字。这样做的目的是保护线程,例如在必须处理数十万个连接的服务器中。
线程是非常昂贵的资源。我们应该尽量谨慎有效地使用它们,以充分利用它们。
NIO 允许我们在同一个线程上打开多个套接字。您基本上可以在单个线程上获得 1000 个套接字连接,而不是 1000 个线程。
让我们以Tomcat为例。Tomcat 是一个带有 JSP/Servlet 容器的网络服务器。它同时支持阻塞 IO 和非阻塞 IO。使用阻塞 IO,它最多可以连接 5K HTTP 连接,但是使用 NIO,当有足够的 RAM 内存可用时,它可以达到 20K HTTP 连接。
因为创建数千个线程会对 JVM 和系统资源造成压力。使用异步 IO,您可以让几个线程监控大量连接,并且效率更高。
对于一个线程(一个套接字),我不能同时执行 read() 或 write(),
您可以同时读取和写入,但您可以在同一个线程中读取和写入。如果您希望写入已知数量的数据或消息,并且希望返回已知数量的数据或消息,您可以在同一个线程中写入然后读取。
例如,如果您有一个简单的服务器进程,您可能会使用单个线程读取请求并写入响应。
我会为不超过几百个连接使用阻塞 IO。如果你有几十个或更少的连接,非阻塞 IO 可能不值得额外的复杂性。