El sistema de ejecuci�n de Java permite que un thread re-adquiera el monitor que ya posee realmente porque los monitores Java son re-entrantes. Los monitores re-entrantes son importantes porque eliminan la posibilidad de que un s�lo thread ponga en punto muerto un monitor que ya posee.
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.