J'ai parfois l'utilisation d'un volatile
variable d'instance dans les cas où j'ai deux fils à la lecture de / écriture à elle et ne veulent pas les frais généraux (ou de blocage potentiel de risque) de prendre un verrou; par exemple, un thread horloge de mettre à jour périodiquement un int ID est exposé comme un getter sur certains de la classe:
public class MyClass {
private volatile int id;
public MyClass() {
ScheduledExecutorService execService = Executors.newScheduledThreadPool(1);
execService.scheduleAtFixedRate(new Runnable() {
public void run() {
++id;
}
}, 0L, 30L, TimeUnit.SECONDS);
}
public int getId() {
return id;
}
}
Ma question: étant Donné que la JLS ne garantit que 32-bit lit sera atomique il y a tout point à jamais à l'aide d'un volatile de temps? (c'est à dire 64 bits).
Mise en garde: Veuillez ne pas répondre en disant que l'utilisation d' volatile
sur synchronized
est un cas de pré-optimisation; je suis bien conscient de comment / quand utiliser synchronized
mais il y a des cas où l' volatile
est préférable. Par exemple, lors de la définition d'un Printemps bean pour une utilisation dans une application unique-thread, j'ai tendance à privilégier volatile
variables d'instance, comme il n'y a aucune garantie que le Printemps est le contexte qui va initialiser chaque bean propriétés dans le thread principal.