Locks & Synchronizers
Use explicit locks (ReentrantLock, ReadWriteLock) and synchronizers (Semaphore, CountDownLatch, CyclicBarrier) when synchronized isn't enough.
The synchronized keyword is simple but inflexible: you cannot try to acquire a lock and give up, you cannot interrupt a thread waiting for it, you cannot time out, and you cannot acquire in one method and release in another. The java.util.concurrent.locks package and the synchronizer classes provide explicit, more capable building blocks for exactly the cases where intrinsic locks fall short.
ReentrantLock = a room key with a timer (give up if waiting too long). ReadWriteLock = a library reading room (many readers, one writer). Semaphore = a parking lot with K spots. CountDownLatch = a starting gun (wait until ready). CyclicBarrier = relay runners meeting at each lap.