Este sitio menciona claramente la diferencia entre ReentrantLock y la palabra clave sincronizada en Java. Yo solo copio y pego desde allí.
http://javarevisited.blogspot.in/2013/03/reentrantlock-example-in-java-synchronized-difference-vs-lock.html
1) Otra diferencia significativa entre ReentrantLock y la palabra clave sincronizada es la equidad. la palabra clave sincronizada no es compatible con la equidad. Cualquier hilo puede adquirir el bloqueo una vez liberado, no se puede especificar ninguna preferencia, por otro lado puede hacer que ReentrantLock sea justo especificando la propiedad de equidad, mientras crea una instancia de ReentrantLock. La propiedad de equidad proporciona bloqueo al hilo de espera más largo, en caso de conflicto.
2) La segunda diferencia entre el bloqueo sincronizado y Reentrant es el método tryLock(). ReentrantLock proporciona el conveniente método tryLock(), que adquiere el bloqueo solo si está disponible o no en otro hilo. Esto reduce el bloqueo del hilo esperando el bloqueo en la aplicación Java.
3) Una diferencia más que vale la pena destacar entre ReentrantLock y la palabra clave sincronizada en Java es la capacidad de interrumpir el hilo mientras se espera el bloqueo. En el caso de la palabra clave sincronizada, un hilo se puede bloquear esperando el bloqueo, por un período de tiempo indefinido y no había forma de controlarlo. ReentrantLock proporciona un método llamado lockInterruptibly(), que se puede usar para interrumpir el hilo cuando está esperando el bloqueo. De manera similar, tryLock() con tiempo de espera se puede usar para agotar el tiempo de espera si el bloqueo no está disponible en un determinado período de tiempo.
4) ReentrantLock también proporciona un método conveniente para obtener la lista de todos los hilos esperando el bloqueo.
"cualquier cliente tiene acceso directo al bloqueo de sincronización de su objeto" solo si aplica el modificador 'synchronized' a un método accesible, no si usa un bloque' synchronized' en un objeto de bloqueo inaccesible. – Raedwald
Sí. Eso es lo que dije. Si usa la palabra clave sincronizada predeterminada en sus métodos, estará publicando efectivamente sus bloqueos. Para evitar esto, haga que el bloque sincronizado sea interno. –