首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在选择器线程以外的其他线程中设置interestOps of SelectionKey是否安全?(爪哇Nio)

在选择器线程以外的其他线程中设置interestOps of SelectionKey是否安全?(爪哇Nio)
EN

Stack Overflow用户
提问于 2015-02-04 13:45:38
回答 2查看 769关注 0票数 0

我见过许多JavaNio示例。它们都在选择器线程中设置了interestOps of SelectionKey。

他们为什么这么做?在选择器线程以外的其他线程中设置interestOps of SelectionKey是否安全?

或者有可能发生异常情况,所以他们会这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-04 13:51:46

SelectionKey JavaDoc说:

兴趣集的读写操作通常与选择器的某些操作同步。这种同步的具体执行方式取决于实现:在简单的实现中,如果选择操作正在进行,读取或写入兴趣集可能会无限期地阻塞;在高性能的实现中,读取或写入兴趣集可能会短暂地阻塞,如果有的话。

结合墨菲定律,它实际上保证了你只会遇到“天真”的实现,所以最好是安全的,而不是道歉,只从选择器线程中使用利息操作,保证它们不会被阻止。

票数 1
EN

Stack Overflow用户

发布于 2015-09-13 14:24:42

在选择器线程以外的其他线程中设置interestOps of SelectionKey是否安全?

我猜你是说多线程安全。

答:是的。实际上,这很常见(我不知道您看过什么NIO代码)

或者有可能发生异常情况,所以他们会这么做?

答:是的,特别是它可以阻止当且仅当选择器线程处于阻塞select()调用

现在,在大多数情况下,这不是一个实际的关注,因为对于繁忙的服务器选择()调用立即返回(或多或少)

为什么?因为总是至少有一个通道要读取字节

问题是,即使是繁忙的服务器也不总是繁忙的(比如凌晨2点),在这种情况下,Reader线程(而不是Selector线程)理论上可能永远阻塞(这是一种竞争条件)。

因此,有几个实践可以缓解(尽管不是消除)竞争条件:

  1. 让选择器线程始终使用时间选择(长ms)调用
  2. 让Reader线程执行以下操作: key.selector().wakeup() key.interestOps(SelectionKey.OP_READ)

在实践中,这使得Reader线程不太可能阻塞很长时间

坦率地说,这并不理想(IMO interestOps()不应该被允许阻止),但比其他方法更好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28322980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档