Приветствую читателей своего блога в очередной раз. Сегодня речь пойдёт о такой интересной и одновременно сложной теме – многопоточное программирование. А точнее – о материалах, которые можно найти по данной теме, в сети. Все упоминаемые мною источники я “пропустил” через себя и поэтому представляю их обзор.

Дисклаймер

Я не являюсь спецом по concurrency. Всё описанное дальше – всего лишь мой путь, который я прошёл в изучении данного вопроса. Так что если вы, как и я, были знакомы с concurrency только понаслышке в рамках небольшого теоретического университетского курса по современным ОС и вам этого оказалось мало, то возможно, данный пост вас подтолкнёт к продолжению изучения данной темы.

Мотивация

Плох тот студент (будущий системный программист), если его не интересуют вопросы параллельных и распределённых вычислений. Учитывая существующие реалии, когда ко всему серьёзному ПО, работающему в кластерах, с каждым годом предъявляются всё более строгие требования по увеличению throughput (пропускной способности системы) и/или уменьшению latency (задержки, отклика на действие), единственным способом справиться с нагрузкой без потери важных бизнес-характеристик становится распределение общей нагрузки на многочисленные физические вычислительные устройства (будь то потоки или отдельные машины в кластерах). Поэтому грамотное понимание особенностей разработки подобных систем и навыки работы с уже существующими решениями, которые упрощают разработку распределённого или многопоточного софта, стали фактически обязательными требованиями для разработчиков, которые планируют работать над серьёзными приложениями в не менее серьёзных компаниях.

Проблематика

И так, допустим, вы за время учёбы в университете что-то слышали про потоки, процессы. Что программы с ними весьма не тривиальны. И вы также становитесь неравнодушны к ним, как я к сладкому 😄 Вас опьяняет чувство, что ещё немного, и вы сможете управлять любым количеством физических устройств как одним целым, а не только своим двухъядерным процом с жалким hyperthreading’ом на домашней тачке. И вот тут начинаются проблемы.

Мало того, что в университете не удалось реально на практике пописать concurrency-программы под присмотром знающего человека, так у тебя и на самом деле сейчас скорее всего нет под рукой железа, на котором можно почувствовать пресловутый performance boost от конкурентных вычислений. Да и на работе молодому юнцу писать что-то подобное вряд ли доверят для продакшена, который должен работать «как часы».

Осознавав, что для начала без нормальной теории совсем некуда ты начинаешь её искать. Но как показывает поиск в гугле – не так чтобы данную тему освещали так же всеобъемлюще, как выход нового IPhone’a. Но, как говорится, «дорогу осилит идущий» и найти весьма достойные источники информации всё-таки можно. Ими и хочу с вами поделится.

Сделаю небольшую ремарку. Я по специализации Java-программист и меня интересовала разработка concurrency прежде всего для неё. Некоторые указанные ниже источники имеют отношение для многопоточки вцелом и не зависят от выбранного языка программирования.

«Современные операционные системы». Э. Таненбаум

Эта книга, с которой началось моё знакомство с данной темой ещё в университете. Её пришлось прочитать для того самого зачёта по современным ОС в универе. В ней была глава, как про сами потоки, так и про программирование работы с ними в современных ОС.

«Java Concurrency in Practice». Brian Goetz, Tim Peierls, Joshua Bloh

Вторую книгу мне подсказал мой бывший руководитель на работе. Она весьма немаленького размера, но в ней разбираются принципы и особенности реализации многопоточных программ на Java с кучей примеров и с использованием concurrency-примитивов, которые есть в библиотеках Java. Очень толковая книжка, как и «Effective Java» Joshua Bloh. По поему скромному мнению, эти две книжки должен прочитать каждый уважающий себя Java программист.

«Thinking in Java (4th Edition)» Bruce Eckel

Полезна для изучения основ работы с потоками и синхронизацией, но мне эта книжка попалась в руки весьма поздно.

Java Memory Model

Для совсем уж досконального понимания принципов работы concurrency-программ на Java не мешало бы ознакомиться с Java Memory Model (до неё у меня пока руки не дошли).

Блог Алексея Шипилева

В нём он рассказывает очень много как о кишочках многопоточности в Java, так и пытается лучше пояснить за саму модель памяти.

Видео докладов

Одним прекрасным днём я для себя открыл сайт [jug.ru] (и соответственно YouTube-каналы JUGRuVideo, СodeFreezeVideo, ITmozg.ru) на которых выложены записи докладов инженеров разных компаний в том числе и по разработке высоконагруженных приложений. Особенно доставляют доклады Алексея Шипелёва, Сергея Куксенко (инженеры Oracle), Романа Елизарова (DevExperts) и товарищей из сервиса Badoo. Первые два канала рекомендую посмотреть почти целиком. Оно того стоит.

Лекции «Школы Анализа Данных»

Речь идёт о выложенных лекциях Школы Анализа Данных (ШАД) по многопоточному и распределённому программированию. Посмотрев вступительный ролик, понимаешь, что это кажется то, что тебе реально не хватало. При чём обучение не останавливается на многопоточном программировании (Java, OpenMP), затрагиваются и распределённые системы (MPI), MapReduce, NoSQL. А узнав, что домашние задания студенты ШАД-а выполняют на учебном кластере из 20 машин, на каждой из которых по 12 хардварных ядер с hyperThreading-ом, просто начинаешь люто завидовать этим студентам. Посмотрев почти целиком все лекции понимаешь, что именно так должен был выглядеть университетский курс, который бы ты точно посещал без прогулов.

Ну вот и всё. Мне кажется, что данного объёма информации вполне достаточно, чтобы смело начинать писать свои первые надёжные concurrency-программы. Если я что найду ещё интересного – обязательно допишу в этот пост.

Если у вас есть достойные материалы по данной теме – присылайте ссылки и они дополнят данный список.

Спасибо за внимание.