我们都从试验和错误中了解到,多个阻塞线程不能很好地扩展,我们应该在可能的情况下切换到使用NIO。然而,没有那么多的资源通过给出一个实际工作原理的底层示例来解释为什么非阻塞更好。
发布于 2015-07-09 16:43:19
我们都从试验和错误中学到了多个阻塞线程不能很好地扩展,
这在10年前是正确的,但是一般来说,使用阻塞IO和NIO工作得足够好。除非你有非常多的连接和一个执行很少的服务,否则你可以在一台现代服务器上舒适地支持多达1000个连接。不要忘记,现在的服务器速度更快了,拥有了更多的核心,人们希望服务器做更多的工作。即瓶颈在应用程序中,而不是IO中。
在可能的情况下,我们应该改用
。
主要的好处是减少了线程开销。正如我所提到的,这并不像十多年前引入NIO时那么高。
使用NIO要困难得多,所以我建议只有在你真的需要的时候才使用它。
没有那么多的资源来解释为什么非阻塞更好
解释是:你使用更少的线程,因此你有更低的开销。只有当每个线程所做的工作很少时,这才重要。
注意:通常假设NIO表示非阻塞,而实际上NIO中所有通道的默认行为都是阻塞的。事实上,在NIO中,只有TCP可以配置为非阻塞。这是例外,而不是规则。
Note2:处理少量连接的最快方法是使用阻塞NIO。
最后,如果使用“直接”或本机缓冲区,则使用NIO的另一个好处是减少了数据复制。然而,同样,你需要进行批量数据传输,一旦你开始以逐字节的方式读/写数据,例如文本,这种开销就会淹没你可能取得的收益。
通过给出一个幕后的例子来说明它是如何工作的。
大多数幕后差异要么不像您想象的那么多,要么完全由操作系统处理,从而使Java甚至JVM看不见。
https://stackoverflow.com/questions/31312151
复制相似问题