我见过许多JavaNio示例。它们都在选择器线程中设置了interestOps of SelectionKey。
他们为什么这么做?在选择器线程以外的其他线程中设置interestOps of SelectionKey是否安全?
或者有可能发生异常情况,所以他们会这么做?
发布于 2015-02-04 13:51:46
SelectionKey JavaDoc说:
兴趣集的读写操作通常与选择器的某些操作同步。这种同步的具体执行方式取决于实现:在简单的实现中,如果选择操作正在进行,读取或写入兴趣集可能会无限期地阻塞;在高性能的实现中,读取或写入兴趣集可能会短暂地阻塞,如果有的话。
结合墨菲定律,它实际上保证了你只会遇到“天真”的实现,所以最好是安全的,而不是道歉,只从选择器线程中使用利息操作,保证它们不会被阻止。
发布于 2015-09-13 14:24:42
在选择器线程以外的其他线程中设置interestOps of SelectionKey是否安全?
我猜你是说多线程安全。
答:是的。实际上,这很常见(我不知道您看过什么NIO代码)
或者有可能发生异常情况,所以他们会这么做?
答:是的,特别是它可以阻止当且仅当选择器线程处于阻塞select()调用中
现在,在大多数情况下,这不是一个实际的关注,因为对于繁忙的服务器选择()调用立即返回(或多或少)
为什么?因为总是至少有一个通道要读取字节
问题是,即使是繁忙的服务器也不总是繁忙的(比如凌晨2点),在这种情况下,Reader线程(而不是Selector线程)理论上可能永远阻塞(这是一种竞争条件)。
因此,有几个实践可以缓解(尽管不是消除)竞争条件:
在实践中,这使得Reader线程不太可能阻塞很长时间
坦率地说,这并不理想(IMO interestOps()不应该被允许阻止),但比其他方法更好
https://stackoverflow.com/questions/28322980
复制相似问题