Quite outdated but still a good book on concurrent programming. A short book that covers topics like semaphores, monitors, Dekker's algorithm, Sleeping Barber problem, Dining Philosopers problem etc.
Concise introduction to concurrent programming principles: starts of with Mutual Exclusion, moves on to Semaphores, Monitors, the Rendez-Vous, and finally ties everything together in a short chapter on the Dining Philosophers Problem. The strength of the book is that each chapter builds on the previous one, solving problems that arise and giving different approaches and levels of abstraction as it goes. Recommended if you want to get the basics of concurrency.
The language used for the algorithms is some Pascal breed; but it does not matter -- it reads like pseudo-code almost all of the time, and I actually think it's a plus that it is not tied to a "modern" language. It forces you to focus on the underlying principles, which happens to be the title.