2009-08-31 8 views
0

私はjava nioセレクタを使用していますが、selector.closeを呼び出している間に次の問題がランダムに発生していますが、セレクタオブジェクトは、アプリケーションの単一のスレッドによってアクセスされています。同じアプリケーションがSolaris、Linux、Windows上で正常に動作します。私は、これは問題がセレクタのAIX実装とされていることを感じてSelector.closeがAIXプラットフォームでjava.util.ConcurrentModificationExceptionをスローする

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 "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 

のjava -version、事前に

おかげで、

ビジェイ

答えて

-1

役に立てば幸い:

  1. が選択キーの変更を関係する操作を同期します。
  2. Selector.close()を呼び出す前に、セレクタに登録されているすべてのSelectionKeysをキャンセルします。
  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 
         } 
        } 
    
0

あなたは反復/変更している別のスレッドを持っていますかSelectorのキーセットは? Selectorのjavaドキュメントから、キーはスレッドセーフではありません。

同時実行

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

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

幸運のデバッグ。私はそれが解決策は、以下の修正で構成さ

関連する問題