Los tutoriales de programación MT recomiendan el uso de variables volátiles típicamente para demarcar condiciones booleanas en estrategias de pooling para comunicación entre threads. Esto no significa que sus valores sean atómicos.
El siguiente programa ilustra este punto. La variable "t" se usa como un contador el cual es incrementado por 1000 threads en tiempos relativamente aleatórios, lo mismo que la variable "t2". El resultado es estable para "t2" (1000) mientras que durante algunas ejecuciones se observa que "t" oscila entre 995 a 1000. Es muy probable que el resultado varíe según la implementación del JRE y de la cantidad de procesadores del computador, pero en general, no hay garantía del incremento atómico de "t".
public class Volatiles implements Runnable {
static volatile long t;
static AtomicLong t2 = new AtomicLong(0);
public static void main(String[] args) throws InterruptedException {
for(int z = 0; z < 100 ; z ++) {
Thread.sleep(10);
for(int j = 0 ; j < 10 ; j ++) {
new Thread(new Volatiles()).start();
}
}
Thread.sleep(2500);
System.out.println("T=" + t + " T2=" + t2.get());
}
@Override
public void run() {
try {
Thread.sleep(1000 + (int) (Math.random() * 100));
} catch(InterruptedException ex) {}
t ++;
t2.incrementAndGet();
}
}
Share
0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.
You must be logged in to post a comment.