Java:SelectionKey.interestOps(int) 不是线程安全的?

标签 java multithreading selector nio

在我的应用程序中,我使用多个线程来处理客户端连接。

我在调试时发现了一个非常奇怪的行为 - 我有一个 SelectionKey,通过调用(使用调试器)其interestOps() 方法,返回值为 1 (READ),但是当我将数据发送到与该键对应的套接字时选择器没有唤醒..

如果使用调试器,我将特定选择关键兴趣操作更改为 1(即使它是 1),选择器会突然对该更改使用react。

在给定时间我只有一个线程处理连接,但该线程并非特定于该连接,如果我禁用多线程(将线程池设置为大小 1),则此问题永远不会发生。

通过查看 SelectionKey 类文档 - 此方法应该是线程安全的 - 我错过了什么吗?

最佳答案

这不是线程安全的问题。如果当前有一个select(),它已经从所有注册的键中读取了所有interestOps,并在读取时选择这些值:这些值被传递给操作系统和操作系统阻塞操作正在进行中。在选择操作中间更改 interestOps 不会影响该选择操作,只会影响下一个操作。

关于Java:SelectionKey.interestOps(int) 不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11523471/

相关文章:

java - 打印数组列表中的元素

java - 子类的构造函数

c# - 在循环中创建新线程

Java 线程和同步列表

multithreading - TCP/IP套接字编程中同步传输和异步传输有什么区别?

ios - 如何检测我是否正在访问仅限 iOS6 的方法?

swift - NSSegmentedControl 操作未触发

jquery - 使用属性 End With 删除元素

ubuntu - 在 Ubuntu 11.10 上安装 IDEA

java - 将逗号分隔的字符串作为参数传递给数据库时