I'm not sure if this is a full answer, but its probably longer than a comment.
I know for example inIn Haskell, modification is literally impossible without getting special modifiable variables through a modification library. Instead, functions create the variables they need at the same time as their values (which are computed lazily), and garbage collected when no longer needed.
Even when you do need modification variables, you can usually get by using sparely, and along with the unmodifiable variables. (Another nice thing in haskell is STM, which replaces locks with atomic operations, but I'm not sure if this is only for functional programming or not.) Usually, only one part of the program will need to be made parallel to improve things performance-wise.
This makes parallelism in Haskell easy a lot of the time, and in fact efforts are under way to make it automatic. For simple code, the parallelism and logic can even be separated.
Also, due to the fact that evaluation order doesn't matter in Haskell, the compiler just creates a queue things that need evaluated, and sends them to whatever cores are avaible, so you can make a bunch of "threads" that don't actually become threads until necessary. Evaluation order not mattering is characteristic of purity, which usually necessitates functional programming.
See Further Reading
https://wiki.haskell.org/Parallelism in Haskell (HaskellWiki),
http://book.realworldhaskell.org/read/concurrent-and-multicoreConcurrent and Multicore Programming in "Real-programming.htmlWorld Haskell" and
http://chimera.labs.oreilly.com/books/1230000000929/index.htmlParallel and Concurrent Programming in Haskell by Simon Marlow