En Java 5.0, se introdujo un mecanismo de sincronización alternativo al lock intrínseco que se define a través de la clase ReentrantLock y cuya funcionalidad se define a través de la interfaz Lock.
El ReentrantLock se introduce por las limitaciones del lock intrínseco:
No es posible interrumpir un thread que espera un wait.
No es posible intentar de forma no bloqueante adquirir un lock sin suspenderse definitivamente en él.
Los lock intrínseco deben ser liberados en el mismo bloque de código en el cual se suspendió.
Comparación:
El Lock intrínseco conduce a un estilo de programación sencillo, seguro y compatible con la gestión de excepciones
El ReentrantLock conduce a estrategias menos seguras, pero mas flexibles, proporciona mayor vivacidad y mejores características de respuesta