'synchronize' will lock any resources accessed within the method. 'lock' allows you more granularity, and control (e.g. only locking some resources, or locking only if a certain condition is met, for example).
The java.util.concurrent locks give you more control on what and when to lock. You can still use the synchronized keyword if it fits your needs (e.g. if you need per-instance / per-class synchronization)