Use advanced Java locks when intrinsic synchronization is too blunt and you need clearer control over fairness, read/write access, or optimistic reads.
Use Java synchronizers such as latches, barriers, semaphores, phasers, and exchangers when threads must coordinate phases or resource access explicitly.