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.