This document discusses process synchronization techniques in operating systems. It covers the critical section problem, Peterson's solution using shared variables, synchronization using semaphores, classic synchronization problems like the bounded buffer, readers-writers problem and dining philosophers problem. Software techniques like monitors and condition variables are explained. It also discusses Java's implementation of synchronization using synchronized methods and wait/notify.