Sto realizzando un programma in java che corre contro alcune macchine. Ogni auto è un thread separato.L'operatore di pre-incremento è thread-safe?
Quando le auto completano la gara, ognuna chiama questo metodo. Ho provato il metodo a diverse velocità del timer e sembra funzionare bene. Ma mi rendo conto che ogni thread sta accedendo alla variabile carsComplete, a volte alla stessa ora esatta (almeno nello scope che il comando date mi sta dando).
Quindi la mia domanda è: questo metodo è thread-safe?
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";
}
}
Oppure sincronizzare qualcosa prima di incrementare. –
@Ted: Scommetto che la sincronizzazione su qualcosa è più costosa. –
@Eric - Sarei sorpreso se AtomicInteger non eseguisse alcuna sincronizzazione ad un certo punto (forse nel codice nativo). Sarebbe interessante per benchmark. Dalla sorgente di AtomicInteger, sembra dipendere da un algoritmo di confronto e impostazione atomico che tenta fino a quando non rileva alcun problema. Non c'è nessun limite peggiore per questo; in scenari altamente filettati, penso che potrebbe essere molto lento a volte casuali. –