No es seguro para subprocesos. Las variables del tipo long
y double
en Java se tratan como dos variables separadas de 32 bits. Un hilo puede estar escribiendo y ha escrito la mitad del valor cuando otro hilo lee ambas mitades. En esta situación, el lector vería un valor que nunca se suponía que existiera.
Para que esto sea seguro para subprocesos que puede o bien declarar myVar
como volatile
(Java 1.5 o posterior) o hacen tanto setIt
y getIt
synchronized
.
Tenga en cuenta que incluso si myVar
era un int
de 32 bits, aún podría encontrarse con problemas de subprocesamiento donde un subproceso podría estar leyendo un valor desactualizado que otro subproceso ha cambiado. Esto podría ocurrir porque el valor ha sido guardado en la memoria caché por la CPU. Para resolver esto, nuevamente necesita declarar myVar
como volatile
(Java 1.5 o posterior) o hacer ambos setIt
y getIt
synchronized
.
También vale la pena señalar que si está utilizando el resultado de getIt
en una llamada posterior setIt
, p. x.setIt(x.getIt() * 2)
, entonces es probable que quieren synchronize
a través de ambas llamadas:
synchronized(x)
{
x.setIt(x.getIt() * 2);
}
Sin la sincronización adicional, otro hilo podría cambiar el valor entre las getIt
y setIt
llamadas causando el valor del otro hilo que se pierde.
¿Es esta tarea? ¿O una pregunta de entrevista? – finnw
@finnw: Siempre que prefiera :) ¿Cuál es la diferencia ...? si no contribuiste ...? ¿Quieres que cambie las etiquetas? –
Tenía curiosidad porque me hicieron una pregunta similar en una entrevista. No hay necesidad de cambiar las etiquetas. – finnw