PROGRAMMERS ARE TAUGHT from the very outset of their study of computing that concurrency—and especially parallelism, a special subset of concurrency—is hard, that only the very best can ever hope to get it right, and even they get it wrong. Invariably, there is great focus on threads, semaphores, monitors, and how hard it is to get concurrent access to variables to be thread-safe.
All in all, not programming with shared memory, but instead using message passing, is likely to be the most successful way of implementing systems that harness the parallelism that is now endemic in computer hardware.