Start here. This is the direct spoken answer to practice first.
Overview
synchronized provides mutual exclusion and memory-ordering guarantees around a specific object's monitor.
A synchronized block acquires the monitor associated with a particular object, runs the block, and releases the monitor even if the block throws. Only one thread at a time can hold that same monitor, so protected code has mutual exclusion. Releasing the monitor happens-before a later acquisition of it, which provides visibility of prior writes. Java intrinsic locks are reentrant, so a thread that already owns the monitor can enter another synchronized section using it.