Состояние гонки в синхронизированном массиве - PullRequest
0 голосов
/ 26 декабря 2018

Я включаю обработку списка объектов в синхронизированный блок, но оказался в состоянии гонки.Я использую синхронизированный блок неправильно или есть другие проблемы с моим кодом?Список на самом деле создается с помощью mapdb.

private static List<MessageHolder> msgHolders;
//messageSequenceDB instantiation
msgHolders = (List<MessageHolder>) messageSequenceDB.indexTreeList("tempStorage", Serializer.JAVA).createOrOpen();


synchronized (msgHolders) {
        System.out.println(Thread.currentThread().getName() +"->"+msgHolders.toString());
        for (MessageHolder holder : msgHolders) {
            if(holder.getStatus().equalsIgnoreCase(STATUS_INITIAL) {
                holder.setStatus(STATUS_DISPATCHED);
                LOGGER.info("MESSAGE SEQUENCER: Message {} dispatched", holder);
                //Remaining code
}}}

Я ожидаю, что один объект будет обработан только одним потоком.Если второй поток попытается отправить его, условие о состоянии не будет выполнено.Но я получаю вывод, так как все потоки обрабатывают лишь несколько сообщений.

Предоставляет пример вывода здесь.

pool-12-thread-1->[MessageHolder [key=TradeId.1, message=1, status=Initial], MessageHolder [key=TradeId.2, message=222, status=Initial]]

pool-12-thread-2->[MessageHolder [key=TradeId.2, message=222, status=Initial], MessageHolder [key=TradeId.1, message=1111, status=Initial]]

pool-12-thread-3->[MessageHolder [key=TradeId.2, message=222, status=Initial]]

pool-12-thread-1->[MessageHolder [key=TradeId.1, message=11, status=Initial]]

Сообщение с идентификатором 222 обрабатывается всеми 3 потоками.Что я должен сделать, чтобы обеспечить синхронизацию?

1 Ответ

0 голосов
/ 24 января 2019

Я решил эту проблему, сделав статус поля изменчивым.

...