0

私はjavanioセレクターを使用していますが、selector.closeを呼び出している間、アプリケーションで次の問題がランダムに発生するようですが、一貫して発生します。セレクターオブジェクトは、私のアプリケーションの単一のスレッドによってアクセスされています。同じアプリケーションがSolaris、Linux、およびWindowsで正常に動作します。これはセレクターの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のjavadocによると、キーはスレッドセーフではありません。

並行性

セレクター自体は、複数の並行スレッドで安全に使用できます。ただし、それらのキーセットはそうではありません。..。

Selector.close()の呼び出し中にスレッドがキーセットで動作している場合、CME例外が発生する可能性があります。スタックトレースを見ると、例外はSunの一般的な実装コードで発生しているため、AIX固有の実装であってはなりません。私の提案は、セレクターキーを追加/削除しているスレッドを特定し、同期されたキーワードを適用する必要があるかどうか、またはキーを操作する前に同期コピーを作成する必要があるかどうかを確認することです。変更するスレッドがスレッド/コードでない場合は、AIXの問題です。ただし、キーセットを変更するコードを見ないとわかりません。

頑張ってデバッグしてください。お役に立てば幸いです

于 2009-08-31T18:17:16.953 に答える
0

このソリューションは、次の修正で構成されていました。

  1. 選択キーの変更を伴う操作を同期します。
  2. Selector.close() を呼び出す前に、セレクターに登録されているすべての SelectionKeys をキャンセルします。
  3. close が呼び出されるとすぐに選択中のスレッドが終了するように、selector.close() のラッパー関数で Selector.wakeup() を呼び出します。

        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 に答える