¿Por qué usar un ReentrantLock si uno puede usar sincronizado (esto)?

Estoy tratando de entender qué hace que el bloqueo en concurrencia sea tan importante si se puede usar synchronized (this). En el siguiente código ficticio, puedo hacer lo siguiente: sincronizó todo el método o sincronizó el área vulnerable ( synchronized(this){...}) O bloquee el área de código...