Рефакторинг – последовательная переработка кода.
Рефакторинг проводится при наличии полного набора тестов.
В системе не дублируется реализация.
Применять повторное использованием даже в мелочах.
Дублирование – главный враг системы.
Код системы возможно понять без глубокого понимания решаемой проблемы.
Постараться сделать код выразительным.
Неравнодушие – драгоценный ресурс.
Использовать прагматичный подход взамен бессмысленного догматизма.
Применять нагрузочное тестирование.
Многопоточность – стратегия устранения привязок.
Многопоточность – аналогия работы нескольких компьютеров.
Многопоточность повышает быстродействие не всегда.
Многопоточность может изменить архитектуру.
При многопоточности нужно предусмотреть проблемы многопоточной взаимной блокировки, одновременное обновление.
Многопоточность требует больше производительности и кода.
Правильная реализация многопоточности сложна.
Ошибки в многопоточности обычно не воспроизводятся.
Многопоточность обычно требует фундаментальных изменений в стратегии проектирования.
Предусмотреть перебивание потоками друг друга (требуется знание обработки байт-кода и атомарных операций модели памяти).
Многопоточные архитектуры должны отделяться от основного кода.
Код реализации многопоточности имеет собственный цикл разработки, модификации и настройки.
При написании кода многопоточности возникают специфические сложности.
Предусмотреть обработку обращений к общему объекту.
Инкапсулировать данные: жестко ограничить доступ и область видимости общих данных.
Вместо использования общего объекта каждому потоку можно предоставить копию.
Использовать синхронизацию.
Потоки должны быть как можно более независимы.
Постараться разбить данные на независимые подмножества, с которыми могут работать независимые потоки (возможно, на разных процессорах).
Использовать потоково-безопасные коллекции.
Использовать неблокирующие решения.
Изучать доступные классы на предмет потоково-безопасности.
Модели логического разбиения поведения программы при многопоточности:
– производители-потребители: потоки-производители создают задания и помещают в буфер или очередь. Потоки-потребители извлекают задания из очереди и выполняют их. Производители перед записью дожидаются появления свободного места в очереди, а потребители дожидаются появления заданий в очереди. Производитель записывает задание и сигнализирует о том, что очередь непуста. Потребитель читает задание и сигнализирует о том, что очередь не заполнена. Обе стороны готовы ждать оповещения