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.