The document discusses various techniques for synchronization in shared memory and distributed systems, including monitors, message passing, remote procedure calls (RPC), and logical clocks. It describes monitors as a synchronization primitive for shared memory that uses condition variables and mutual exclusion. For distributed synchronization it discusses message passing with channels/ports/mailboxes and RPC/rendezvous. Classical synchronization problems like the readers-writers problem and dining philosophers problem are presented along with their solutions. Logical clocks are introduced as a way to order events in a distributed system when physical clocks may be skewed.