My recommendation to younger colleagues has been: Learn Go and Erlang. Go implements (basically) communicating sequential processes. If you want to know more from a theory side, you can read C.A.R. Hoare's book on the topic [0]. Erlang uses the actor model and message passing. There are many similarities but enough differences that you can learn a lot by learning both. Other languages offer these same approaches, but these two are the closest mainstream languages I'm aware of that take CSP or actor model as almost their basic design philosophy. This reduces the semantic distance between the language and the theory and makes it easy to learn, IMHO.
Lots of good resources for both, you can google around for.
After getting the hang of things here, I'd continue with studying the concurrency primitives or libraries of your language of choice. You'll hopefully find that you can apply the knowledge you've found from the first two to designing good concurrent software in most other languages.