0

我正在使用 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版本

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

任何指针表示赞赏,

提前致谢,

维杰

4

2 回答 2

0

您是否有另一个线程正在迭代/修改 Selector 的键集?在 Selector 的 java 文档中,键不是线程安全的。

并发

选择器本身对于多个并发线程来说是安全的;但是,它们的键集不是。...

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

祝调试顺利。我希望它有帮助

于 2009-08-31T18:17:16.953 回答
0

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

  1. 同步涉及修改选择键的操作。
  2. 在调用 Selector.close() 之前取消所有在选择器中注册的 SelectionKey。
  3. 在 selector.close() 的包装函数中调用 Selector.wakeup() 以便在调用 close 时立即退出选择线程。

        boolean isContinue = true;
        while(isContinue) {
            try {
                for(SelectionKey selectionKey : selector.keys()) {
                    selectionKey.channel().close();
                    selectionKey.cancel();
                }
                isContinue = false; // continue till all keys are cancelled
            } catch (ConcurrentModificationException e) {
                // This should not occur. But log a debug message in case this is encountered
            }
        }
    
于 2009-09-17T12:39:33.460 回答