powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / ConcurrentModificationException Помогите разобраться с ошибкой.
7 сообщений из 7, страница 1 из 1
ConcurrentModificationException Помогите разобраться с ошибкой.
    #39974785
ToTAmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Упорно вылезает следующая ошибка:
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
ConcurrentModificationException Помогите разобраться с ошибкой.
    #39974791
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ToTAmon
Не могу понять с чем это связано

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

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


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

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

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

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

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

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


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


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