Start here. This is the direct spoken answer to practice first.
Overview
Both can provide mutual exclusion and visibility; ReentrantLock adds control at the cost of manual ownership.
synchronized is concise and releases its monitor automatically when the block exits. ReentrantLock provides explicit lock and unlock operations with the same basic mutual-exclusion and visibility role. It is useful when code needs timed tryLock, interruptible acquisition, several Condition objects, or an explicit fairness policy. Because unlocking is manual, it belongs in a finally block immediately after successful acquisition.