Java阻塞IO - 写操作有什么优势吗?

时间:2014-12-14 22:22:58

标签: java tcp io nio nonblocking

在Java中阻止IO API accept()阻塞,直到连接可用并且read()阻塞,直到输入可用。

write()是否也阻止了不同的阻止IO OutputStreams? 那么write()FileOutputStreamSocketOutputStream(TCP)类中会阻塞多长时间?

编辑:或者更广泛地问:非阻塞IO对写操作有什么好处吗?

1 个答案:

答案 0 :(得分:4)

  

write()是否也阻止了不同的阻止IO OutputStreams?那么write()在FileOutputStreamSocketOutputStream(TCP)类中阻塞了多长时间?

它会阻塞,直到您要求写入的所有数据都传送到操作系统。这没有理论上限。不同类型的流类之间没有理论上的差异。

实际上,阻止的时间长度取决于数据传输的速度。写入本地文件通常是最快的。涉及网络的任何事情都取决于网络(和NIC)带宽,延迟和拥塞。 (包括使用文件流将文件读/写到本地安装的远程文件系统的情况。)


  

这是否意味着阻塞与非阻塞写入没有性能提升?如果有的话,他们是什么?

不,它并不意味着......确切地说。 潜在的性能改进不是直接的。

如果您有很多正在阅读和/或写作的联系,那么绩效就会提高。

  • 使用阻塞I / O,您实际上每个连接需要一个线程,每个线程都有与之关联的重要资源(例如线程堆栈内存),并且每当您进行线程上下文切换时都会产生开销。拥有大量线程通常也会增加其他因素,例如锁争用,堆空间使用,GC开销,虚拟内存占用,分页活动。

  • 使用非阻塞I / O(和选择器),您可以使用一个线程直接为多个连接提供服务,也可以通过队列将工作传递给工作线程。


  

非阻塞IO对写操作有什么好处吗?

正确使用非阻塞I / O 允许您以更少的资源支持更多并发客户端。但是对于单个连接/客户端,使用非阻塞I / O没有加速。