Concurrency is hard, try to avoid anything that makes it harder. A lot of the functional languages have something we can all learn from here. For Java I recommend this:<p>- always make your class fields final, if they must be non-final, question why and decide what will happen across threads.<p>- use executors and futures instead of rolling your own threads. Most, if not all, concurrency patterns can be built around these.<p>- when all else fails and you need the primitives from this article, make sure you read <a href="https://books.google.com/books/about/Java_Concurrency_in_Practice.html?id=EK43StEVfJIC" rel="nofollow">https://books.google.com/books/about/Java_Concurrency_in_Pra...</a> before writing a line of concurrent code.<p>By the way, that book is all about Java, but is excellent at getting across concepts that a practical for general concurrency best practices.