前言
从《实战:使用 Java NIO 编写服务端应用》可以看到,使用 Java 原生的 NIO 接口编写一个服务端应用程序相对比较复杂,并且需要考虑许多的细节问题。而上文举的例子本身无论是在协议制定还是功能需求上都是比较简单的。而且这个例子还是一个功能定制化的应用。如果需要完成具备可扩展性的 IO 框架性质的程序,方便应用在其上进行二次开发,无疑更加困难。线程模型的设计,供二次开发的应用程序接口的设计,内存的管理,并发的控制等等一系列难度都在摆在面前。
让情况更糟糕的是,Java 的 NIO 实现存在 Bug。选择器Selector
的select
方法在特定的情况会在没有 IO 事件发生的情况返回,且该bug触发后,select
就会一直在没有 IO 事件的情况返回而不是阻塞等待。通常的编程模型中,都是将Selector
的select
放置在一个 while 循环中。所以一旦这个 Bug 被触发,就会导致程序快速的轮训,进而CPU100%耗尽系统资源。表现在应用程序外部就是系统仍然在运行,但是无法对客户端请求作出响应了。
由于基于原生NIO接口进行开发的