Нам нужны естественные абстракции для высококонкурентных алгоритмов. Актеры (подумайте: Эрланг) проделывают большой путь в этом направлении, но они не являются универсальным решением для всех. Некоторые более специфические абстракции, такие как fork / join или map / lower, могут быть еще проще применить к распространенным проблемам.
Хитрость во всех этих абстракциях параллелизма заключается в том, что они требуют программирования в функциональном стиле. Параллелизм плохо сочетается с общим изменяемым состоянием. Как говорится, «Замки считаются вредными». Поскольку большинство разработчиков имеют исключительно императивный опыт, переход на метод продолжения без разделения ресурсов часто бывает чрезвычайно сложным.
Кстати, в отношении абстракций параллелизма Clojure имеет некоторые очень интересные особенности в этом направлении. Он не только имеет своего рода акторов, но и определяет модель транзакционной памяти (например, базы данных) вместе с глобальным механизмом атомарных ссылок. Эти две функции позволяют параллельным операциям совместно использовать «изменяемое» состояние, не беспокоясь о блокировке или гонке.
В конце концов, все сводится к образованию. Большая часть необходимой теоретической работы по абстракциям параллелизма уже выполнена, нам просто нужно принять это. К сожалению, как доказывают Эрланг и Хаскелл, иногда лучшие идеи остаются отодвинутыми на крайне ограниченный демографический уровень. Надеемся, что такие усилия, как Scala и Clojure, позволят внедрить более продвинутые абстракции в мейнстрим, перенеся их на существующую, хорошо поддерживаемую платформу (JVM).