2012-04-16 3 views
0

Мне нужно перебирать FastMap.values. Моя проблема заключается в том, что основной цикл при сбое NullPointerExceptionИсключительное исключение указателя - повторение значений FastMap

основной петли

Collection<Order> orders = myObject.getOpenOrders(); 
    for (Order order : orders) { 
} 

Проблема в том, что другой поток в моей системе редактирует fastmap Это добавление и удаление элементов к нему, и я получаю NullPointerException. Редко, но это нужно решить.

Так я добавил Null чек

Collection<Order> orders = myObject.getOpenOrders(); 
    for (Order order : orders) { 
     if (order != null) 
    } 

и до сих пор я получаю NullPointerExcetion Так что я попытался перебирать его следующим образом

FastMap<String, Order> openOrders = myObject.getOpenOrdersMap(); 
    for (FastMap.Entry<String, Order> e = openOrders.head(), end = openOrders.tail(); (e = e.getNext()) != end && e != null;) { 
     Order order = e.getValue(); 
    } 

Но тогда цикл останавливается, когда он получает нулевое значение, а не бросать NullPointerExcetion. И это тоже проблема, так как мне нужно итерировать все элементы.

Я предполагаю, что проблема заключается в том, что для итерации используются значения(), и на самом деле это указатель на список. Я попытался скопировать список, но затем я также получаю NullPointerExcetion в процессе копирования. любые погрешности

BTW: Я знаю, что изменение всей конструкции - лучшее решение и использование замков в каждой вставке и чтении. но есть ли какие-то небольшие изменения, которые я могу сделать, чтобы решить мою проблему?
Любая идея?

+1

Javolution 'FastMap'? IIRC, Javolution делали всевозможные дикие претензии, но реализация была явно неправильной. Если вам действительно нужны параллельные коллекции, я предлагаю 'java.util.concurrent'./'NullPointerException' должен содержать сведения о том, где он был запущен. –

ответ

2

Это не классы JDK? (? Javolution) Из того, что дока говорит:

Если карта помечена общего то все операции являются поточно- включая итерации над коллекциями МАП

Таким образом, вы можете столкнуться с некоторым параллелизмом проблема? Попробуйте это:

FastMap<String, Order> openOrders = myObject.getOpenOrdersMap().shared()

+1

Я бы не поверил документации для Javolution. –

+0

Ну, его ценность дает попробовать ... –

+0

@ TomHawtin-tackline Вы правы, он эффективно превращается в Hashtable, если его «общий», не очень быстрый, если вы спросите меня (из-за чрезмерной синхронизации).И даже тогда этого не происходит - перед отношениями между put'ом и get's общей карты, то есть она не является потокобезопасной. –

2

Если у вас многопоточная среда, вы ДОЛЖНЫ абсолютно использовать некоторую синхронизацию, особенно при работе с итераторами.

Вы не можете перебирать коллекцию, а другой поток ее редактирует, это приведет к недействительности итераторов и сломает все.

Итак, проглотите таблетку и используйте некоторую синхронизацию, для этого требуется эта ситуация.

Смежные вопросы