Synchronization is needed in all systems and environments where several processors (or processes) can be active at the same time. This is the case for operating systems, distributed systems, database systems, distributed computing, and multi-threading and concurrent programming languages. The different textbooks (and courses) about these systems and programming languages, all include at least one chapter (two lectures) about synchronization algorithms.This book studies synchronization techniques and algorithms, and concurrent programming concepts. It is suitable for use as core reading for courses on synchronization algorithms and/or concurrent programming. It is also ideal additional reading for courses such as distributed computing (covering many relevant topics in detail) and operating systems,when there is an interest in expanding the coverage and devoting more time to the subject of synchronization.