In my experience, many (skilled) developers lack foundational knowledge about concurrency theory. The classic textbooks on Operating Systems by Tanenbaum or Stallings do a good job in explaining the theory and implications of concurrency: Mutual exclusion, synchronization, deadlocks and starvation. A good theoretical background is mandatory to successfully work with concurrency.
That being said, concurrency support varies greatly between programming languages and different libraries. Furthermore, test-driven development doesn't get you very far in detecting and solving concurrency problems (although transient test failures indicate concurrency issues).