Java - ayuda con " Synchronized ", concurrencia Java

 
Vista:
sin imagen de perfil
Val: 18
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

ayuda con " Synchronized ", concurrencia Java

Publicado por Renzo (10 intervenciones) el 09/04/2018 17:45:09
Buen día a todos, tengo un problema con este codigo,
questioForo

entiendo esto de la sguiente forma :
1.- Si creo un newFixedThread(10), significa que hay 10 hilos para ejecutar 10 tareas concurrentes
2.- Con el loop "for" envio 1000 tareas y solo 10 se ejecutaran concurrentemente, las demas esperaran un hilo disponible
3. El metodo que llama el lambda esta sincronizado, significa que solo un hilo puede ejecutarlo y otro tendra que esperar hasta que este termine
4.- Entonces si el metodo solo es usado por un hilo, porque el contador al imprimirlo no devuelve 1000, sino

questioForo2
o
questioForo3

5.- En mi logica deberia imprimir de salida siempre 1000, pero no es asi, alguien me explica el porque

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class OCP2 {
 
    int stroke = 0;//variable no atomic
 
    public synchronized void swimming() {
        stroke++;
    }
 
    public static void main(String[] args){
        ExecutorService s = Executors.newFixedThreadPool(10);
        OCP2 a = new OCP2();
 
        for(int i=0; i<1000; i++) {
                s.execute(() -> a.swimming());
        }
        s.shutdown();
        System.out.println(a.stroke);
    }
}
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
sin imagen de perfil
Val: 349
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

ayuda con " Synchronized ", concurrencia Java

Publicado por Andrés (340 intervenciones) el 10/04/2018 06:07:03
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html#execute(java.lang.Runnable)

void execute(Runnable command)

Executes the given command at some time in the future. The command may execute in a new thread, in a pooled thread, or in the calling thread, at the discretion of the Executor implementation.

la línea: System.out.println(a.stroke); se ejecuta antes de que los threads terminen.
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