Estás en la correcta. volátil proporciona una garantía de visibilidad. sincronizado proporciona una garantía de visibilidad Y serialización de secciones de códigos protegidos. Para situaciones MUY sencillas, volátil es suficiente, sin embargo, es fácil tener problemas al usar volátiles en lugar de sincronización.
Si se va a suponer que la cuenta tiene una manera de ajustar su equilibrio inestable entonces no es lo suficientemente bueno
public void add(double amount)
{
balance = balance + amount;
}
entonces tenemos un problema si el saldo es volátil con ninguna otra sincronización. Si dos hilos eran para tratar de llamar a añadir() junto usted podría tener una "perdida" de actualización, donde ocurre lo siguiente
Thread1 - Calls add(100)
Thread2 - Calls add(200)
Thread1 - Read balance (0)
Thread2 - Read balance (0)
Thread1 - Compute new balance (0+100=100)
Thread2 - Compute new balance (0+200=200)
Thread1 - Write balance = 100
Thread2 - Write balance = 200 (WRONG!)
Obviamente esto es un error, porque los dos hilos leer el valor actual y actualizada de forma independiente y luego escribió de nuevo (leer, computar, escribir). volátil no ayuda aquí, por lo que necesitaría sincronización para asegurar que un hilo completó la actualización completa antes de que el otro hilo comenzara.
En general, si al escribir código creo "puedo usar volátil en lugar de sincronizado", la respuesta podría ser "sí", pero el tiempo/esfuerzo de resolverlo y el peligro de equivocarse no vale la pena el beneficio (rendimiento menor).
Como nota aparte, una Clase de cuenta bien manejada manejaría toda la lógica de sincronización internamente para que las personas que llaman no tengan que preocuparse por ello.
Estás en lo correcto, pero el artículo es realmente acerca de algo completamente diferente - reducir el alcance de bloqueo. – gustafc