当前位置: 首页 > 知识库问答 >
问题:

Java:SelectionKey。线程(int)不是线程安全的吗?

舒仲渊
2023-03-14

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

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

如果使用调试器,我将特定选择键更改为1(即使是1),选择器会突然对该更改做出反应。

在给定的时间内,我只有一个线程处理一个连接,但这个线程不是特定于那个连接的,如果我禁用多线程(将线程池设置为大小1),这个问题就不会发生。

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

共有3个答案

轩辕亮
2023-03-14

我参加派对有点晚了,但对于像我这样的人来说,未来会去拜访:

多个并发线程可以安全地使用选择键。读取和写入兴趣集的操作通常会与选择器的某些操作同步

取自"SseltionKey inJava7"

松阳泽
2023-03-14

在我将对InterestTops的所有更改移动到选择器线程上之后,问题就解决了——所以我猜InterestTops(int)不是线程安全的。

编辑
通过将所有更改移动到选择器线程,我也获得了30%的加速率-不确定为什么,但这是我测试之间唯一的更改。。

方梓
2023-03-14

这不是线程安全的问题。如果当前有一个select(),则它已经从所有注册密钥中读取了所有值,并且正在按读取时的方式选择这些值:这些值被传递到操作系统,操作系统正在执行阻塞操作。在选择操作的中间更改<代码> Advops<代码>不会影响选择操作,只会影响下一个操作。

 类似资料:
  • 问题内容: Java线程安全性易变吗?也就是说,可以安全地读取和写入它而无需锁定吗? 问题答案: 是的,您可以从中读取并安全地对其进行写入-但您不能做任何复合操作,例如安全地对其进行递增,因为这是一个读/修改/写周期。还有一个问题是它如何与 其他 变量的访问交互。 坦率地说,volatile的确切性质令人困惑(有关更多详细信息,请参见JLS的内存模型部分)-我 个人 通常会使用它作为确保正确使用的

  • 问题内容: 我注意到,如果我尝试在循环内使用goroutines将其追加到切片,那么在某些情况下我会丢失/空白数据: 有时,当我从中打印all 时,某些元素是空字符串(),而在另一些情况下,in中则不存在某些元素。 我的代码是否存在数据争用,是否意味着对于多个goroutine并发使用来说不是线程安全的? 问题答案: 在Go中,没有值可以安全地进行并行读/写操作,切片(切片头)也不例外。 是的,您

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?