我使用的是java nio选择器,并且在调用selector.close时,在我的应用程序中似乎随机但一致地遇到以下问题。选择器对象正被我的应用程序中的单个线程访问。相同的应用程序在Solaris、Linux和Windows上运行良好。我觉得这是Selector的AIX实现的一个问题
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
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
发布于 2009-09-17 12:39:33
该解决方案包括以下修复:
boolean isContinue = true;while( isContinue ) { try { for(SelectionKey selectionKey : selector.keys()) { selectionKey.channel().close();selectionKey.cancel();}isContinue= false;//继续,直到取消所有键} catch (ConcurrentModificationException e) { //这不应该发生。但是记录一条调试消息,以防遇到这种情况} }
发布于 2009-08-31 18:17:17
你有没有另外一个线程在迭代/修改Selector的键集?在Selector的java文档中,键不是threadsafe。
并发性
选择器本身可以安全地由多个并发线程使用;但是,它们的键集却不安全。..。
当Selector.close()被调用时,如果你有一个线程在键集上工作,你可能会得到CME异常。查看堆栈跟踪,异常发生在Sun的公共实现代码中,因此它不应该是特定于AIX的实现。我的建议是确定添加/删除选择器关键字的线程,并查看是否需要应用同步关键字,或者在处理关键字之前需要进行同步复制。如果修改线程不是您的线程/代码,那么就是AIX问题。但是,如果没有看到修改密钥集的代码,我就无法判断。
祝你调试顺利。我希望它能帮上忙
https://stackoverflow.com/questions/1356262
复制相似问题