Возможно, ответ уже был в другом постере.
У меня есть переменная типа List внутри объекта Window.
К этому списку обращаются несколько раз через базовый метод получения:
Код: Выделить всё
public List getFiles() {
return files;
}
Поток A (архивирование) → выполняет итерацию по списку для архивирования определенных файлов.
Поток B (сортировка) → полностью очищает список, а затем повторно заполняет его в новом порядке (в соответствии с вызванной внешней ссылкой).
Вот упрощенная версия задействованного кода:
Поток A :
Код: Выделить всё
public WindowFile retrieveWindowFile(AbstractWindow pWindow, String pFileName) {
WindowFile lWindowFile = null;
for (WindowFile lFile : pWindow.getFiles()) {
if (lFile.getFileName().equals(pFileName)) {
lWindowFile = lFile;
break;
}
}
return lWindowFile;
}
Код: Выделить всё
pWindow.getFiles().clear();
pWindow.getFiles().addAll(lMap.values());
Это приводит к редкому, но критическому исключению NullPointerException во время выполнения, и мы теряем архив.
Я ищу лучший способ предотвратить эту проблему, не добавляя слишком много синхронизации накладные расходы.
Вот возможные подходы, которые я определил на данный момент:
- Синхронизировать метод получения.
Просто реализовать, но может часто блокироваться, если список часто читается. - Синхронизировать непосредственно в списке (например, Synchronized(files) { ... }) во время операций чтения/записи.
Работает хорошо, пока ссылка на файлы никогда не переназначается. - Создайте копию (снимок) списка перед его изменением или перебором.
Избегает блокировки других потоков, но немного увеличивает использование памяти. - Используйте параллельную структуру, такую как CopyOnWriteArrayList или ReadWriteLock.
Может быть излишним, поскольку список часто перестроен с нуля.
Какой подход будет лучшим в этом конкретном случае?
Рекомендуете ли вы просто синхронизировать список или лучше каждый раз делать снимок?
Есть ли более чистое или эффективное решение без рефакторинг всей архитектуры?
Заранее спасибо
Подробнее здесь: https://stackoverflow.com/questions/797 ... ss-and-the
Мобильная версия