Java - Resultado incorrecto al sincronizar sentencias

 
Vista:

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!

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Resultado incorrecto al sincronizar sentencias

Publicado por Tom (1831 intervenciones) el 29/11/2015 09:58:00
Bueno, cada instancia de TwoMutex bloquea _su_propio_objeto_ mutex1, que no es visible para el resto ...

Lógicamente, si quieres sincronizar dos hilos entre sí, necesitarás locks visibles para ambas.

Prueba a definir como static la variable mutex1.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar