Quick Answer
volatile: ensures a variable is always read from main memory (not CPU cache) - fixes visibility, not atomicity. Reads/writes are not atomic for long/double. synchronized: mutual exclusion + visibility - all operations inside are atomic. Atomic (AtomicInteger etc.): lock-free atomic operations using CAS (compare-and-swap) - faster than synchronized for simple counters and flags.
This answer has been peer-reviewed by industry experts holding senior engineering roles to ensure technical accuracy and relevance for modern interview standards.