Найти в Дзене

Чистый код. Конспект. Глава 13. Часть 1. Многопоточность.

Глава длинная и сложная, поэтому разобью на две части. Заметки:

  1. В многопоточке есть проблема, что код может выглядеть нормально, но с повышенной нагрузкой всё сломается.
  2. Многопоточный код помогает отделить выполняемую операцию от момента ее выполнения.
  3. Отделение "что" и "когда" способно кардинально улучшить производительность и структуру приложения.
  4. Дальше целая большая страница про то, что многопоточность — это очень важно и полезно.
  5. Многопоточность всегда сопряжена с определенными затратами (время, производительность, силы, нервы).
  6. Правильная реализация сложна даже для простых задач.
  7. Ошибки многопоточности обычно плавающие и не воспроизводятся, поэтому они часто игнорируются как случайные.
  8. Многопоточность часто требует фундаментальных изменений в проектировании.
  9. Нужно понимать как компилятор обрабатывает сгенерированный байт-код и разбираться в том, какие операции рассматриваются моделью памяти Java как атомарные. Вот это я, кстати, никогда не рассматривала и не интересовалась. Надо будет поизучать.
  10. Всегда помните принцип единственной ответственности. Класс/метод/что угодно имеют только одну причину для изменения. Отделяйте код, относящийся к многопоточности, от остального кода.
  11. Чем больше в коде мест, где используются общие данные, тем с большей вероятностью вы где-то забудете поставить synchronized, что приведет к нарушению работы. И в этом случае велик шанс дублирования. Также будет труднее найти источник сбоя.
  12. Как правило копирование каких-то объектов позволяет избежать синхронизации в коде. Экономия на защитных блокировках окупит затраты на создание объектов и уборку мусора.
  13. Потоки должны быть как можно более независимы. Каждый поток в идеале работает в своем независимом мире со своими локальными переменными.
  14. Используйте потоко-безопасные коллекции. Удивительно, но ConcurrentHashMap почти всегда работает лучше HashMap.

Мифы многопоточности:

  1. Многопоточность всегда повышает быстродействие. Это актуально только при большом времени ожидания, которое могли бы использовать более эффективно другие потоки.
  2. Написание многопоточного кода не изменяет архитектуру программы. Архитектура многопоточной и однопоточной программы сильно отличаются.
  3. При работе с контейнером (веб-контейнер или что-то джавовое) разбираться в проблемах многопоточного программирования не обязательно. Тоже не так. Желательно знать как все работает, чтобы защититься от проблем обновления и взаимных блокировок.