Reason about concurrent code from the memory model rather than from intuition, well enough to say why a program that looks correct is not, to choose the cheapest construct that is still correct, and to recognise the bugs that only appear under load
What Two Threads Can Break

Concurrency goes wrong in ways that reading the code does not reveal, because the code you wrote is not the order that runs. This course derives the hazards, the guarantees that remove them, and what each guarantee costs.
8 lessons, written and corrected before you arrived. Reading them here needs no account. The first reads the whole way through; the others open and then stop, because a page nobody owns cannot tell who is reading it. Starting the course gives you your own copy, where every idea has problems standing under it and you can ask about any sentence.