Selector.close создает исключение java.util.ConcurrentModificationException на платформах AIX - PullRequest
0 голосов
/ 31 августа 2009

Я использую java nio selector и, похоже, случайно, но постоянно сталкиваюсь с проблемой в моем приложении при вызове 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

Любые указатели приветствуются,

Заранее спасибо,

Виджей

Ответы [ 2 ]

0 голосов
/ 17 сентября 2009

Решение состояло из следующих исправлений:

  1. Синхронизация операций, связанных с модификацией клавиш выбора.
  2. Отмените все SelectionKeys, зарегистрированные в селекторе, прежде чем вызывать Selector.close ().
  3. Вызовите Selector.wakeup () в функции-обертке selector.close (), чтобы выбранный поток завершился сразу после вызова 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 голосов
/ 31 августа 2009

Есть ли у вас другой поток, который повторяет / модифицирует набор ключей Selector? Из документа Java Селектора ключи НЕ являются потокобезопасными.

параллелизм

Селекторы сами по себе безопасны для использования несколькими параллельными потоками; их Наборы ключей, однако, не являются. ...

Вы можете получить исключение CME, если у вас есть поток, работающий над набором ключей во время вызова Selector.close (). Если посмотреть на трассировку стека, исключения встречаются в общих кодах реализации Sun, поэтому это не должна быть реализация, специфичная для AIX. Мое предложение было бы определить поток, который добавляет / удаляет ключи выбора, и посмотреть, нужно ли применять синхронизированное ключевое слово, или вам нужно сделать синхронизирующую копию перед работой с ключами. Если изменяющий поток не является вашим потоком / кодами, то это проблема AIX. Однако я не могу сказать, не видя кодов, которые модифицируют набор ключей.

Удачи в отладке. Я надеюсь, что это поможет

...