Multithreading is becoming ubiquitous to build high-performance software. Multithreaded programs, however, are both harder to write and harder to debug. The random occurrence of tricky bugs make them highly time-consuming to find. In this context, program verification is a powerful tool to build safe multithreaded programs. This book adapts separation logic - a novel and successful technique to reason about imperative programs - to multithreaded object-oriented programs à la Java. First it shows how to finely reason about the start and join primitives for multithreading. Second, this book shows to reason about reentrant locks i.e. Java''s locks. Then, the book describes two novel applications of separation logic : debugging of specifications by means of protocols and enhancement of verification by disproving. The book concludes with an entirely new approach to automatic parallelization that 1/ permits to parallelize arbitrary code (i.e. not only loops) 2/ offers high confidence in the parallelized programs obtained. This book is targeted to theorists and practitioners of program verification that aim at discovering the last advances in this field.