Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.
Chapter 6 spends a lot of time discussing how Clojure manages state safely in a concurrent environment. State management is definitely the trickiest part of concurrent programming, and the attention Clojure pays to getting state management right is well spent.
However, discussions of state management do not address how a program becomes parallel to begin with, and the best strategies for splitting the execution of a program among various threads. Although it's not as sticky a problem, it's still important to understand. Knowing how and when to distribute execution among multiple threads will allow you to maximize concurrency in your program, making it faster and guaranteeing scalability as it is run on machines with more and more processors.