Я бы посоветовал также взглянуть на потокобезопасную очередь блокировки Кристофа Гранда ; в нем меньше 20 строк, но он обладает множеством функциональных возможностей и, на мой взгляд, демонстрирует экспертное использование некоторых функций параллелизма Clojure, неизменности, атомов и ленивых последовательностей.
Учтите, что альтернатива Java java.util.concurrent.LinkedBlockingQueue - это 842 строки тонкого (возможно, сложного) прокомментированного кода, и вы начинаете понимать, как Clojure действительно выполняет свое обещание параллелизма; значительно повышает уровень абстракции и обеспечивает правильную реализацию с примерно в 10-20 раз меньше кода.
Вы также заметите, что при чтении кода Java действительно трудно увидеть лес за деревьями ... Если бы вам дали его, могли бы вы быть уверены в его правильности, посмотрев на него? Также имейте в виду, что этот код был написан Дагом Ли (возможно, главным экспертом по параллелизму Java) и предназначен для чтения Java; Я очень сомневаюсь, что смог бы быстро написать читаемый исполняемый код, такой как этот, на Java и быть уверенным в его правильности.
Сравните это с версией Clojure и, познакомившись с основами Clojure, легко разобраться и понять, как это работает ... В течение 20 минут я смог понять каждую строчку реализации и убедиться в ее правильности , И теперь, когда я намного лучше знаком с идиомами Clojure и FP, я думаю, что теперь это займет у меня около 5 минут. Я также, вероятно, смогу написать «правильный» код, подобный этому, в Clojure за часы или минуты.
Christophes обертка clojure из вышеприведенного java-класса также поучительна, поскольку она имеет тот же функциональный интерфейс, что и первая версия.