Why it matters
Race conditions and deadlocks are the hardest bugs to reproduce. Getting concurrency right up front is much cheaper than debugging it later.
The architecture
Thread: Java thread maps to OS thread. Creating threads directly is anti-pattern; use ExecutorService.
synchronized: keyword-based monitor lock. Simple but coarse-grained.
java.util.concurrent.locks.ReentrantLock: explicit lock API with tryLock, timed lock, and interruptible lock. More flexible than synchronized.
How it works end to end
Atomic classes: AtomicInteger, AtomicReference. Use CAS operations for lock-free updates. Fast when contention is low.
Concurrent collections: ConcurrentHashMap, CopyOnWriteArrayList. Thread-safe without external synchronization.
ExecutorService: submit tasks to a thread pool. Get Futures back. Avoid creating threads yourself.
Virtual threads (Java 21): lightweight threads managed by the JVM, not OS. Millions can run concurrently. Great for I/O-bound work.