Resultado incorrecto al sincronizar sentencias
Publicado por Marteens (5 intervenciones) el 28/11/2015 19:01:17
Hola.
En el programa que adjunto creo tantos threads como indique el parámetro que recibo al ejecutar la aplicación.
Todos los hilos incrementan una variable global y, para evitar errores, sincronizo el acceso al incremento de dicha variable para que dos hilos no intenten hacerlo simultáneamente. Si hago el sincronismo con semáforos o sincronizando los métodos, funciona perfectamente pero sincronizando sentencias observo resultados erróneos. Por ejemplo, si envío 5000, al finalizar la ejecución, la variable, en algunas ocasiones, vale 4999 o 4998.
El código es prácticamente igual al que se puede ver en la documentación de oracle en la siguiente web: https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
No entiendo dónde puede estar el problema.
Muchas gracias!
En el programa que adjunto creo tantos threads como indique el parámetro que recibo al ejecutar la aplicación.
Todos los hilos incrementan una variable global y, para evitar errores, sincronizo el acceso al incremento de dicha variable para que dos hilos no intenten hacerlo simultáneamente. Si hago el sincronismo con semáforos o sincronizando los métodos, funciona perfectamente pero sincronizando sentencias observo resultados erróneos. Por ejemplo, si envío 5000, al finalizar la ejecución, la variable, en algunas ocasiones, vale 4999 o 4998.
El código es prácticamente igual al que se puede ver en la documentación de oracle en la siguiente web: https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
No entiendo dónde puede estar el problema.
Muchas gracias!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class GlobalVar {
public static int c1 = 0;
}
class TwoMutex extends Thread {
private Object mutex1 = new Object();
public void inc1() {
synchronized(mutex1) {
GlobalVar.c1++;
}
}
@Override
public void run() {
inc1();
}
}
public class SentenciasSincronizadas {
public static void main(String[] args) throws InterruptedException {
int n = Integer.parseInt(args[0]);
TwoMutex hilos[];
System.out.println("Creando " + n + " hilos");
hilos = new TwoMutex[n];
for (int i = 0; i < n; i++) {
hilos[i] = new TwoMutex();
hilos[i].start();
}
for (int i=0; i < n; i++)
hilos[i].join();
System.out.println("C1 = " + GlobalVar.c1);
}
}
Valora esta pregunta


0