1. bug表现

NIO编程需要解决的Epoll Bug

  • 正常情况下,selector.select()操作是阻塞的,只有被监听的fd有读写操作时,才被唤醒
  • 但是,在这个bug中,没有任何fd有读写请求,但是select()操作依旧被唤醒
  • 很显然,这种情况下,selectedKeys()返回的是个空数组
  • 然后按照逻辑执行到while(true)处,循环执行,导致死循环。

2. bug 原因

在部分Linux的2.6的kernel中,poll和epoll对于突然中断的连接socket会对返回的eventSet事件集合置为POLLHUP,也可能是POLLERR,eventSet事件集合发生了变化,这就可能导致Selector会被唤醒。

3. 解决办法

在比如jetty , netty 中都有相应的解决方案,最终的终极办法是创建一个新的Selector。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-12-02
  • 2022-01-04
  • 2021-11-04
  • 2022-12-23
猜你喜欢
  • 2021-06-18
  • 2022-01-23
  • 2021-09-13
  • 2022-01-09
  • 2022-12-23
相关资源
相似解决方案