JavaOpt: Мультипоточность
JavaOpt: Мультипоточность
- Многопоточный код следует хранить обособленно от однопоточного. Желательно наличие какого-то простого механизма для переключения между ними (в идеале, фабрика или использование полиморфизма)
- При многопоточной работе особое внимание следует уделить shared объектам (публичным) и их данным
- Чрезмерная многопоточность тоже плохо - время на управление синхронизацией, создание/запуск/остановка потоков требует ресурсов, сборка мусора от большого количества потоков, утечка ресурсов, сложность разработки и отладки.
- Лучше рассматривать поток как изолированную сущность, не обменивающуюся данными с другими потоками. Исключениями для обмекна могут быть синхронизированные объекта (а лучше, immutable)
- Следует избегать блокировки 2 и более объектов в рамках класса
- Блоки/методы
synchronized
максимально короткие. В целом, чем короче блокировка - тем лучше. Так же, блокировать поток следует тогда когда это реально нужно; высвобождать чем быстрее - тем лучше - Любое тестирование не исключает ошибок, а просто снижает шанс их появления. При многопоточной работе приложения, вероятность ошибок возрастает многократно
- Перед реализацией многопоточного кода, выполняющего определенную задачу, следует сначала отладить и удостовериться в стабильной работе однопоточной версии.
- Тестировать многопоточное приложение надо:
- На 1 потоке
- На 2 потоках
- На 3+ потоках
- На *2 от продуктовой среды
- На медленных/быстрых потоках
- В несколько итераций
- Количество потоков желательно сделать конфигурируемой опцией (в идеале - через параметр приложения).
Перевод в однопоточный режим должен полностью исключать многопоточную реализацию. Указание количества потоков, равного 1 НЕ должен быть эквивалентом запуска в однопоточном режиме. Thread.yield
- метод позволяет имитировать инвалидно пошедший ход выполнения потока. Можно вставлять его между строками кода, тем самым имитировать возможные нарушения. Актуально только для среды разработки- Jiggling - техника, при которой в случайные участки кода (но довольно часто) вставляются точки, при которых случайным образом выполняется одно из действий:
- задержка в ожидании (
Thread.sleep
) - получение управления потоком (
Thread.yield
) - ошибка (
throw new RuntimeException
) - ничего
Частично данную технику реализует ConTest от IBM, сегодня библиотека уже не доступна.
Comments
Comment plugin failed to load
Loading comment plugin