设为首页 加入收藏

TOP

2.6.1 不选择Java原生NIO编程的原因
2014-07-09 13:01:05 来源: 作者: 【 】 浏览:220
Tags:2.6.1 选择 Java 原生 NIO 编程 原因

2.6.1  不选择Java原生NIO编程的原因

现在我们总结一下为什么不建议开发者直接使用JDK的NIO类库进行开发,具体原因如下。

(1)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

(2)需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。

(3)可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐的工作量和难度都非常大。

(4)JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。官方声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该BUG发生概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单可以参见以下链接内容。

http://bugs.java.com/bugdatabase/view_bug.do bug_id=6403933

http://bugs.java.com/bugdatabase/view_bug.do bug_id=2147719

异常堆栈如下。
 

  1. java.lang.Thread.State: RUNNABLE  
  2.         at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)  
  3.         at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:210)  
  4.         at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)  
  5.         at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)  
  6.         - locked <0x0000000750928190> (a sun.nio.ch.Util$2)  
  7.         - locked <0x00000007509281a8> (a java.util.Collections$ UnmodifiableSet)  
  8.         - locked <0x0000000750946098> (a sun.nio.ch.EPollSelectorImpl)  
  9.         at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)  
  10.         at net.spy.memcached.MemcachedConnection.handleIO(Memcached Connection.java:217)  
  11.         at net.spy.memcached.MemcachedConnection.run(MemcachedConnection. java:836) 

由于上述原因,在大多数场景下,不建议大家直接使用JDK的NIO类库,除非你精通NIO编程或者有特殊的需求。在绝大多数的业务场景中,我们可以使用NIO框架Netty来进行NIO编程,它既可以作为客户端也可以作为服务端,同时支持UDP和异步文件传输,功能非常强大。

下个小节我们就看看为什么选择Netty作为基础通信框架。
 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.6 选择Netty的理由 下一篇2.6.2 为什么选择Netty

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)