JavaOpt: Мультипоточность

JavaOpt: Мультипоточность


  1. Многопоточный код следует хранить обособленно от однопоточного. Желательно наличие какого-то простого механизма для переключения между ними (в идеале, фабрика или использование полиморфизма)
  2. При многопоточной работе особое внимание следует уделить shared объектам (публичным) и их данным
  3. Чрезмерная многопоточность тоже плохо - время на управление синхронизацией, создание/запуск/остановка потоков требует ресурсов, сборка мусора от большого количества потоков, утечка ресурсов, сложность разработки и отладки.
  4. Лучше рассматривать поток как изолированную сущность, не обменивающуюся данными с другими потоками. Исключениями для обмекна могут быть синхронизированные объекта (а лучше, immutable)
  5. Следует избегать блокировки 2 и более объектов в рамках класса
  6. Блоки/методы synchronized максимально короткие. В целом, чем короче блокировка - тем лучше. Так же, блокировать поток следует тогда когда это реально нужно; высвобождать чем быстрее - тем лучше
  7. Любое тестирование не исключает ошибок, а просто снижает шанс их появления. При многопоточной работе приложения, вероятность ошибок возрастает многократно
  8. Перед реализацией многопоточного кода, выполняющего определенную задачу, следует сначала отладить и удостовериться в стабильной работе однопоточной версии.
  9. Тестировать многопоточное приложение надо:
  • На 1 потоке
  • На 2 потоках
  • На 3+ потоках
  • На *2 от продуктовой среды
  • На медленных/быстрых потоках
  • В несколько итераций
  1. Количество потоков желательно сделать конфигурируемой опцией (в идеале - через параметр приложения).
    Перевод в однопоточный режим должен полностью исключать многопоточную реализацию. Указание количества потоков, равного 1 НЕ должен быть эквивалентом запуска в однопоточном режиме.
  2. Thread.yield - метод позволяет имитировать инвалидно пошедший ход выполнения потока. Можно вставлять его между строками кода, тем самым имитировать возможные нарушения. Актуально только для среды разработки
  3. Jiggling - техника, при которой в случайные участки кода (но довольно часто) вставляются точки, при которых случайным образом выполняется одно из действий:
  • задержка в ожидании (Thread.sleep)
  • получение управления потоком (Thread.yield)
  • ошибка (throw new RuntimeException)
  • ничего

Частично данную технику реализует ConTest от IBM, сегодня библиотека уже не доступна.

 Comments
Comment plugin failed to load
Loading comment plugin