Java Multithreading: Cómo sincronizar subprocesos para acceso simultáneo [SOLUCIONADO]

Comenzaremos con una profundización en el concepto de Java Multithreading. En la jerga de Java, multithreading se refiere a la capacidad de una sección de código para ejecutarse simultáneamente en múltiples subprocesos.

Esencialmente, sincronizar subprocesos en Java es una táctica que permite múltiples subprocesos acceder a los mismos recursos sin problemas de consistencia.

public class MyRunnable implements Runnable {

    private Resource resource;

    public MyRunnable(Resource r){
        this.resource = r;
    }
  
    public void run(){
        synchronized(resource){
            resource.use();
        }
    }
}

El bloque synchronized significa que solo un subproceso puede acceder al recurso a la vez.

Deadlock, es un término que se refiere a cuando dos o más subprocesos están bloqueados de manera que cada uno está esperando que el otro libere un recurso.

public class A {

    private B b;

    public synchronized void doSomething() {
    
        b.doSomethingElse();
    }
}

public class B {

    private A a;

    public synchronized void doSomethingElse() {
    
        a.doSomething();
    }
}

El código anterior es un ejemplo clásico de cómo puede ocurrir un deadlock si estos dos subprocesos intentan invocar los métodos sincronizados de la otra clase al mismo tiempo.

En el siguiente ejemplo, veremos una forma común de evitar los deadlocks conocida como lock ordering.

public class AvoidingDeadlock {

    private final Object tieLock = new Object();

    private OtherResource other;

    public void doSomething() {
        synchronized(tieLock) {
            // access resources
        }
    }
}

Finalmente, Thread Scheduler es parte del sistema de tiempo de ejecución de Java que decide qué subproceso debe ejecutarse. No tenemos control directo sobre el programador de hilos.

public class MultiThread implements Runnable {

    @Override
    public void run() {
        
        System.out.println(Thread.currentThread().getId() + " Value " + i);
    }

    public static void main(String args[]) {
    
        for(int i=0; i < 10; i++){
            Thread t = new Thread(new MultiThread ());
            t.start();
        }
    }
}

La última línea de este código crea y arranca 10 hilos. Sin embargo, Thread Scheduler determina el orden en que se ejecutan.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad