В книге Чистый код есть несколько советов о том, как тестировать параллельный код. Один совет, который помог мне найти ошибки параллелизма, - это одновременное выполнение большего количества тестов, чем у процессора.
В моем проекте выполнение тестов на моей четырехъядерной машине занимает около 2 секунд. Когда я хочу протестировать параллельные части (для этого есть несколько тестов), я удерживаю в IntelliJ IDEA горячую клавишу для запуска всех тестов, пока не увижу в строке состояния, что выполняется 20, 50 или 100 тестовых прогонов. Я следую в диспетчере задач Windows за использованием ЦП и памяти, чтобы узнать, когда все тестовые прогоны закончили выполняться (использование памяти увеличивается на 1-2 ГБ, когда все они запущены, а затем медленно снижается).
Затем я закрываю один за другим все диалоговые окна вывода тестового прогона и проверяю, не было ли сбоев. Иногда бывают неудачные тесты или тесты, которые находятся в тупике, и затем я исследую их, пока не найду ошибку и не исправлю ее. Это помогло мне найти пару неприятных ошибок параллелизма. При столкновении с исключительной / тупиковой ситуацией, которая не должна была произойти, самое главное, всегда предполагать, что код нарушен, безжалостно исследовать причину и исправлять ее. Нет космических лучей, которые вызывают случайный сбой программ - ошибки в коде приводят к сбою программ.
Существуют также структуры, такие как http://www.alphaworks.ibm.com/tech/contest, которые используют манипуляции с байт-кодом, чтобы заставить код выполнять большее переключение потоков, что увеличивает вероятность появления ошибок параллелизма.