Concurrency forces the programmer to be more careful about information sharing. This difficulty coincidentally encourages good functional programming practices, such as immutable data and pure functions; when computation is not context-sensitive, it tends to also be thread-safe.
Functional programming sounds great for concurrency, but are there downsides?
In one example of good intentions with bad effects, during development of a functional language called Haskell, the development team (https://www.infoq.com/interviews/armstrong-peyton-jones-erlang-haskell) wanted to make programs run faster using concurrency. Due to a unique trait of the Haskell language, it was possible to run all expressions and sub-expressions in new threads. The development team thought this sounded great and tested it out.
The result was that more time was spent spawning...