The Art of Multiprocessor Programming by Shavit & Herlihy. Recommend topping it off with the lecture delivered at Microsoft Research ( https://youtu.be/nrUszqrlvi8 )
The book is divided into two sections: Principles and Practice. The former introduces basic terminology, concepts and common mistakes. The latter is where it gets interesting and introduces real-world problems like cache coherence traffic.
The language used in the book is Java but the concepts can be applied to practically any language that supports concurrency. Highly recommended!