2009-08-31 5 views
0

java nio 선택기를 사용하고 있는데 selector.close를 호출하는 동안 응용 프로그램에서 다음 문제를 무작위로하지만 일관되게 발생시키는 것 같습니다. selector 객체는 응용 프로그램의 단일 스레드에 의해 액세스됩니다. 동일한 응용 프로그램이 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 

자바 -version 사전에

감사합니다,

비제이

답변

-1

도움이되기를 바랍니다 :

  1. 는 선택 키의 수정과 관련된 작업을 동기화 할 수 있습니다.
  2. Selector.close()를 호출하기 전에 selector에 등록 된 모든 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 문서에서 키는 스레드 세이프가 아닙니다.

동시성

선택기는 복수의 병행 thread로 에 대한 자체 안전; 그러나 키 세트는 그렇지 않습니다. 당신이 Selector.close 동안 키 세트 작업 스레드()가 호출되고있는 경우 ...

당신은 CME 예외가 발생할 수 있습니다. 스택 트레이스를 살펴보면 썬의 일반적인 구현 코드에서 예외가 발생하므로 AIX에 특정한 구현이되어서는 안됩니다. 내 제안은 선택기 키를 추가/삭제하는 스레드를 식별하고 동기화 된 키워드를 적용해야하는지 확인하거나 키 작업을하기 전에 동기화 사본을 만들어야합니다. 수정 스레드가 스레드/코드가 아닌 경우 AIX 문제점입니다. 그러나, 나는 열쇠를 수정하는 코드를 보지 않고 말할 수 없다.

행운을 빌어 요 디버깅. 나는이 솔루션은 다음과 같은 수정으로 구성