que tienen una porción de código que se parece a esto:¿Las variables volátiles de Java imponen una relación de pasar antes de que se lea?
Fragmento A:
class Creature {
private static long numCreated;
public Creature() {
synchronized (Creature.class) {
numCreated++;
}
}
public static long numCreated() {
return numCreated;
}
}
Desde mi entender, ya que la lectura de numCreated
no está sincronizado, si Rosca-A crea un Creature
a la 1 pm , y el hilo B lee numCreated()
a las 2 p.m., numCreated()
bien puede haber devuelto 0 o 1 (incluso cuando el hilo-A ha terminado de inicializar el objeto a las 1.05 p.m.).
por lo que añade synchronized
a numCreated()
:
fragmento B:
class Creature {
private static long numCreated;
public Creature() {
synchronized (Creature.class) {
numCreated++;
}
}
public static synchronized long numCreated() { // add "synchronized"
return numCreated;
}
}
y todo está bien, excepto que yo estaba pensando, si modifico a Fragmento C, es la variable numCreated
¿Todavía está sincronizado correctamente?
Fragmento C:
class Creature {
private static volatile long numCreated; // add "volatile"
public Creature() {
synchronized (Creature.class) {
numCreated++;
}
}
public static long numCreated() { // remove "synchronized"
return numCreated;
}
}
Con Fragmento C, es que garantiza que tan pronto como hilo-A completa la creación de objetos a las 1:05 de la tarde, el llamado del Thread-B a numCreated()
es seguro para volver 1
?
PS: Tengo entendido que en una situación real que probablemente utilice un AtomicLong
pero esto es con fines de aprendizaje
lecturas volátiles son baratas, esto es lo que necesita saber. Sin embargo, las escrituras no son baratas, sin embargo. La sincronización requiere tanto una escritura volátil como CAS (comparar y establecer), además de que los monitores desafiados se lanzan al sistema operativo, lo que es la motivación para impl bloquearse. – bestsss
dado el comentario anterior, no intente jugar * más inteligente * quitando volátil. – bestsss
@bestsss No entiendo tu último comentario, ¿a qué te refieres con no eliminar la volatilidad? (en Snippet C agregué volátiles y eliminé el sincronizado) – Pacerier