In this lecture, we will extend the core proof system in order to support synchronization constructs like Hoare monitors, locks, semaphores, or asynchronous message-passing, for the support of which separating conjunction allows quite elegant proof rules. This proof system will ensure that proved programs are race-free, in the sense that a memory cell cannot be accessed by two threads simultaneously. We will then investigate a weaker notion of race, where multiple readers are allowed to read (but not write) the same cell simultaneously, which will drive us to the notion of permission algebras. We will also consider the problem of distributed memory leaks, and we will answer it by a notion of communication's contract.