Consideremos esta clase:
class Reentrant {
public synchronized void a() {
b();
System.out.println("Estoy aquí, en a()");
}
public synchronized void b() {
System.out.println("Estoy aquí, en b()");
}
}
Esta clase contiene dos métodos sincronizados: a() y b(). El primer método sincronizado, llama al otro método sincronizado.
Cuando el control entra en el método a(), el thread actual adquiere el monitor del objeto Reentrant. Ahora, a() llama a b() y como también está sincronizado el thread también intenta adquirir el monitor de nuevo. Como Java soporta los monitores re-entrantes, esto si funciona. El thread actual puede adquirir de nuevo el monitor del objeto Reentrant y se ejecutan los dos métoso a() y b(), como evidencia la salida del programa:
Estoy aquí, en b()
Estoy aquí, en a()
En sistemas que no soportan monitores re-entrantes, esta secuencia de llamadas a métodos causaría un punto muerto.