condición de carrera en arraylist sincronizado

Anitha.R:

Estoy incluyendo el procesamiento de la lista de objetos en un bloque sincronizado, pero terminó en condición de carrera. ¿Estoy usando el bloque sincronizado erróneamente o hay algún otro problema con mi código? La lista es en realidad una instancia con 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
}}}

Estoy esperando un objeto a ser procesado por un solo hilo. Si el segundo hilo intenta enviar que, en la condición de estado debería fallar. Pero estoy de salida como, algunos mensajes son procesados ​​por todas las discusiones.

Proporcionando salida de ejemplo aquí.

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]]

El mensaje con el identificador 222 se procesa por todos los 3 hilos. ¿qué debo hacer para asegurar la sincronización?

Anitha.R:

He resuelto esto haciendo el estado de campo tan volátil.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=219970&siteId=1
Recomendado
Clasificación