Estoy haciendo un programa en java que compite con algunos coches uno contra el otro. Cada automóvil es un hilo separado.¿El operador de preincremento es seguro para subprocesos?
Cuando los autos completan la carrera, cada uno de ellos llama a este método. He probado el método a diferentes velocidades de temporizador, y parece funcionar bien. Pero me doy cuenta de que cada hilo está accediendo a la variable carsComplete, a veces exactamente al mismo tiempo (al menos en el alcance que me da el comando date).
Así que mi pregunta es: ¿este método es seguro para subprocesos?
public static String completeRace()
{
Date accessDate = new Date();
System.out.println("Cars Complete: " + carsComplete + " Accessed at " + accessDate.toString());
switch(++carsComplete)
{
case 1: return "1st";
case 2: return "2nd";
case 3: return "3rd";
default: return carsComplete + "th";
}
}
O sincronice en algo antes de incrementar. –
@Ted: Apuesto a que sincronizar algo es más caro. –
@Eric - Me sorprendería si AtomicInteger no hiciera alguna sincronización en algún momento (tal vez en código nativo). Sería interesante hacer una evaluación comparativa. Desde la fuente de AtomicInteger, parece depender de un algoritmo de comparación y ajuste atómico que vuelve a intentar hasta que no detecta ningún problema. No hay el peor de los casos obligado para esto; en escenarios altamente enhebrados, creo que podría ser muy lento en momentos aleatorios. –