首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AIX平台上抛出java.util.ConcurrentModificationException的Selector.close

在AIX平台上抛出java.util.ConcurrentModificationException的Selector.close
EN

Stack Overflow用户
提问于 2009-08-31 07:35:23
回答 2查看 1.4K关注 0票数 0

我使用的是java nio选择器,并且在调用selector.close时,在我的应用程序中似乎随机但一致地遇到以下问题。选择器对象正被我的应用程序中的单个线程访问。相同的应用程序在Solaris、Linux和Windows上运行良好。我觉得这是Selector的AIX实现的一个问题

代码语言:javascript
复制
java.util.ConcurrentModificationException   
 at java.util.HashMap$AbstractMapIterator.checkConcurrentMod(HashMap.java:118)   
 at java.util.HashMap$AbstractMapIterator.makeNext(HashMap.java:123)   
 at java.util.HashMap$KeyIterator.next(HashMap.java:196)   
 at sun.nio.ch.SelectorImpl.implCloseSelector(SelectorImpl.java:95)   
 at java.nio.channels.spi.AbstractSelector.close(AbstractSelector.java:102)   
 at org.beepcore.beep.transport.tcp.TCPSelector.close(TCPSelector.java:173)   

java -version

代码语言:javascript
复制
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap6460sr5ifix-20090729_01(SR5+IZ55981))
IBM J9 VM (build 2.4, J2RE 1.6.0 IBM J9 2.4 AIX ppc64-64 jvmap6460sr5ifx-20090728_39709 (JIT enabled, AOT enabled)
J9VM - 20090728_039709_BHdSMr
JIT  - r9_20090518_2017
GC   - 20090417_AA)
JCL  - 20090529_01

任何指针都很受欢迎,

提前谢谢你,

Vijay

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-17 12:39:33

该解决方案包括以下修复:

  1. 同步修改选择键的操作。
  2. 在调用Selector.wakeup()的包装器函数中的selector.close Selector.wakeup()之前,取消所有注册到选择器的close,这样一调用,选择线程就会退出。

boolean isContinue = true;while( isContinue ) { try { for(SelectionKey selectionKey : selector.keys()) { selectionKey.channel().close();selectionKey.cancel();}isContinue= false;//继续,直到取消所有键} catch (ConcurrentModificationException e) { //这不应该发生。但是记录一条调试消息,以防遇到这种情况} }

票数 0
EN

Stack Overflow用户

发布于 2009-08-31 18:17:17

你有没有另外一个线程在迭代/修改Selector的键集?在Selector的java文档中,键不是threadsafe。

并发性

选择器本身可以安全地由多个并发线程使用;但是,它们的键集却不安全。..。

当Selector.close()被调用时,如果你有一个线程在键集上工作,你可能会得到CME异常。查看堆栈跟踪,异常发生在Sun的公共实现代码中,因此它不应该是特定于AIX的实现。我的建议是确定添加/删除选择器关键字的线程,并查看是否需要应用同步关键字,或者在处理关键字之前需要进行同步复制。如果修改线程不是您的线程/代码,那么就是AIX问题。但是,如果没有看到修改密钥集的代码,我就无法判断。

祝你调试顺利。我希望它能帮上忙

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

https://stackoverflow.com/questions/1356262

复制
相关文章

相似问题

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