L'utilisation de volatiles sur une variable réduit le risque d'erreur de cohérence de la mémoire (veuillez me corriger si cela révèle des lacunes dans ma compréhension de tout concept pertinent). Ainsi, dans l'exemple suivant, même si la variable c1 est volatile, toujours l'apparition des résultats d'erreur de constance de mémoire dans c1 devenant 15 ou parfois 14 dans la sortie plutôt que la sortie correcte 16.Utilisation de volatiles sur des variables atomiques
class Lunch implements Runnable {
private volatile long c1 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
// synchronized(lock1) { c1 is volatile
c1++;
// }
}
public void run() {
try {
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
Thread.sleep(1000);
inc1();
}
catch(InterruptedException e) {
return;
}
}
public long value() {
return c1;
}
public static void main(String args[]) throws InterruptedException {
Lunch l = new Lunch();
Thread t1 = new Thread(l);
Thread t2 = new Thread(l);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(l.value());
}
}
L'hypothèse ici est que ++ est atomique. Vérifiez vos hypothèses! – nos
(Je m'inquiète un peu de votre utilisation de la phrase "réduit le risque".) Habituellement, le but est d'éviter tout risque.) –