Гость
Форумы / Java [игнор отключен] [закрыт для гостей] / ConcurrentModificationException Помогите разобраться с ошибкой. / 7 сообщений из 7, страница 1 из 1
30.06.2020, 20:45
    #39974785
ToTAmon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
Упорно вылезает следующая ошибка:
runjava.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1495)
at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1518)
at Model.FineReader.SubServerFinereader.run(SubServerFinereader.java:71) - в представленном коде сторока 10 "for(String key: listFineReaderTaskskeySet) {"
at java.base/java.lang.Thread.run(Thread.java:830)

Не могу понять с чем это связано. И прошу помощи.

Идея в том что по мере запуска процессов, чистятся две очереди заданий, общая (статик) и обычная принадлежащая экземпляру объекта. Процессов одновременно не должно быть больше 5. Но это все не важно. Проблема именно с удалением из
Код: java
1.
2.
    private HashMap<String, FineReaderTask> listFineReaderTasks;
    public static ArrayList<UniversalTask> tasksAll = new ArrayList<UniversalTask>();




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    public void run() {
        testProcesses(this.processes,this.workFiles);
        while (this.processes.size()> 5){
            SharedUtilites.pause(5);
            testProcesses(this.processes,this.workFiles);
        }
        
        ArrayList<String> MasDel = new ArrayList<String>();
        Set<String> listFineReaderTaskskeySet = this.listFineReaderTasks.keySet();
        for(String key: listFineReaderTaskskeySet) {
            String file = this.listFineReaderTasks.get(key).universalTask.nameTask;
            String comandIn = this.listFineReaderTasks.get(key).universalTask.getComandFull();
            try {
                FileProcess fileP = new FileProcess(file, comandIn);
                processes.add(fileP);
                workFiles.add(file);
                MasDel.add(key);
                SharedUtilites.pause(10);
            } catch (Exception e) {
                System.out.println("Не получилось создать процесс");
                System.out.println(e.toString());
                SharedUtilites.pause(4);
            }
        }
        int masDelSize = MasDel.size()-1;
        for(int i = masDelSize;i >= 0; i--){
            synchronized (this.listFineReaderTasks) {
                UniversalTask TempUni = this.listFineReaderTasks.get(MasDel.get(i)).universalTask;
                ServerMedconsult.tasksAll.remove(TempUni);
                this.listFineReaderTasks.remove(MasDel.get(i));
            }
        }
    }
...
Рейтинг: 0 / 0
30.06.2020, 21:34
    #39974791
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
ToTAmon
Не могу понять с чем это связано

просто сообщение об ошибке немного вводит в заблуждение. у тебя synchronized блок защищает только удаление, а чтение у тебя как раз в той самой 10-й строке не-синхронизировано и ошибка выскакивает из-за того, что один поток читает не синхронизированную коллекцию, которую другой поток в это время уже поменял. Короче это защита от проктологов типа тебя, чтоб не сломали себе мозг от необъяснимой магии мультипоточки
...
Рейтинг: 0 / 0
30.06.2020, 21:35
    #39974792
ToTAmon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
ToTAmon,

Сам спросил сам разобрался. Добавил
Код: java
1.
 synchronized (ServerMedconsult.tasksAll) {


И все нормализовалось. Можно закрывать.
...
Рейтинг: 0 / 0
30.06.2020, 21:36
    #39974793
ToTAmon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
chpasha,

Спасибо.
Да
synchronized (ServerMedconsult.tasksAll) {
synchronized (this.listFineReaderTasks) {
Разместил над циклом и заработало.

Подскажите плиз, а как надо было сделать по уму?
...
Рейтинг: 0 / 0
30.06.2020, 21:40
    #39974794
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
ToTAmon
Подскажите плиз, а как надо было сделать по уму?

использовать синхронизированные коллекции, зачем этот велосипед с synchronized если есть ConcurrentHashMap
...
Рейтинг: 0 / 0
30.06.2020, 23:43
    #39974813
ToTAmon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
chpasha
использовать синхронизированные коллекции, зачем этот велосипед с synchronized если есть ConcurrentHashMap

Да, я мало работал с потоками. Честно считал, что так как у меня запись и удаление в синглтон помещены то все норм, и можно использовать привычные коллекции. Был не прав значит.
...
Рейтинг: 0 / 0
01.07.2020, 20:16
    #39975058
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConcurrentModificationException Помогите разобраться с ошибкой.
chpasha
ToTAmon
Подскажите плиз, а как надо было сделать по уму?

использовать синхронизированные коллекции, зачем этот велосипед с synchronized если есть ConcurrentHashMap


ConcurrentHashMap не синхронизированная, а потокобезопасная.
Там внутри много магии, а synchronized мало
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ConcurrentModificationException Помогите разобраться с ошибкой. / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]