Estoy tratando de averiguar si el código de abajo adolece de posibles problemas de simultaneidad. Específicamente, la cuestión de la visibilidad relacionada con las variables volátiles. volátil se define como: El valor de esta variable no se almacenan en caché hilos a nivel local: todas las lecturas y escrituras irá directamente a "memoria principal"Concurrencia, visibilidad del objeto
public static void main(String [] args)
{
Test test = new Test();
// This will always single threaded
ExecutorService ex = Executors.newSingleThreadExecutor();
for (int i=0; i<10; ++i)
ex.execute(test);
}
private static class Test implements Runnable {
// non volatile variable in question
private int state = 0;
@Override
public void run() {
// will we always see updated state value? Will updating state value
// guarantee future run's see the value?
if (this.state != -1)
this.state++;
}
}
Por lo anterior único ejecutor roscado:
¿Está bien hacer test.state no volátil? En otras palabras, cada Test.run() sucesivo (que ocurrirá secuencialmente y no concurrentemente porque de nuevo el ejecutor tiene un solo subproceso), siempre vea el valor test.state actualizado? De lo contrario, no sale de Test.run() para asegurarse de que cualquier cambio realizado en el hilo localmente se vuelva a escribir en la memoria principal? De lo contrario, ¿cuándo se vuelven a escribir en la memoria principal los cambios hechos localmente, si no al salir del hilo?
dónde sacaste esa definición. Suena como una definición JMM pre-1.5 (que no era implementable). –
http://www.javamex.com/tutorials/synchronization_volatile.shtml – Integer
Es importante darse cuenta de que cuando el hilo completa 'Test.run()', el hilo no termina, y cualquier garantía sobre los valores escritos por un el hilo que se va a enjuagar a la memoria principal antes de que termine no se aplica.El subproceso de método 'run()' que invoca su 'Test.run()' es simplemente un bucle, que bloquea hasta que recibe una nueva tarea para ejecutar. Cuando esa tarea regresa del método * its * 'run()', el hilo bloquea hasta la siguiente tarea; no termina (y por lo tanto, vacia su estado). – erickson