Адская многопоточность

153
02 декабря 2018, 16:20

Ситуация такая: в пэкедже создается 6 энтити, которые в свою очередь являются потоками. Во время выполнения они заходят в saveTelegram (для того чтобы получить id из базы) и получается так, что пара энтити имеют одинаковый id, по этому часть не записывается в таблицу.

Synchronized не помогает, так как потоки не зависят друг от друга. Среди работающих вариантов решения проблемы были пауза thread.sleep(1000) и автоинкрементить id сразу в таблице не заходя в saveTelegram - но такое решение не подходит. Есть ли еще идеи как решить данную проблему?

@Lock(LockType.WRITE)
    public Telegram saveTelegram(String ioNode, long userId,  
            String functionCode, byte[] payload) throws ProcessException {
        TelegramId histObj = persistenceManager.findTelegramId(); 
        Long entityId = histObj.getNextVal();//вытаскиваем id из таблицы TelegramId
        persistenceManager.updateTelegramId(histObj);
        TelegramHist telegramHist = createTelegram(entityId,
                ioNode, userId, payload, functionCode); 
        telegramHist = persistenceManager.saveOrUpdate(telegramHistoric);//записываем энтити в другую таблицу
        return telegramHist;
    }

так как данную проблему решает thread.sleep(1000) и две энтити ссылаются на один айдишник - я думаю что этот метод не потокобезопасный. И как решить данную проблему не знаю

Answer 1

надо в самом методе методА сделать возможность некого лока для потоков.

Одним из простых и рабочих решениях может быть использование try-lock ReentrantLock.

public class MyClass { 
    private final ReentrantLock lock = new ReentrantLock(true);
    public Integer getMethodA() { 
         lock.lock(); 
         try { 
            /// вот тут получение ID
            return ID;
         } finally {
            lock.unlock();
    }
Answer 2

Ну да тут наследование вообще никакой роли не играет. Самое простое это сделать метод статическим и синхронизированным(static synchronized) и будет синхронизация.

READ ALSO
Изменить дизайн MaterialDateTimePicker Android

Изменить дизайн MaterialDateTimePicker Android

столкнулся с проблемой редактирования view MaterialDateTimePicker, как это сделать? Например, хочу поменять backgroundColor у у нижнего элемента - mdtp_animator - как...

162
NullPointer adapter при переходе с интента

NullPointer adapter при переходе с интента

Я в андроиде еще новичек поэтому иногда не могу понять по каким причинам в нем происходят некоторые ошибки, в гугле ничего так и не нашел

165
Как сделать задний фон некоторым словам в TextFlow

Как сделать задний фон некоторым словам в TextFlow

Нужно сделать фон найденным словам в TextFlow

172
Как установить картинку в ImageView из SD накопителя?

Как установить картинку в ImageView из SD накопителя?

На SD есть папка с изображениемУ меня есть к ней путь

186