Я написал много многопоточного кода и никогда не находил ничего такого, что могло бы легко проверить наличие ошибок правильности параллелизма, которые я не предсказал.Большую часть времени мне приходится думать о сценарии, в котором он может сломаться, и о том, как я могу доказать его правильность в экстремальной версии этого (часто используя CountDownLatches или аналогичные, чтобы согнуть его так, как я думаю, он может сломаться.
Обязательно используйте FindBugs и аналогичные инструменты статического анализа, чтобы помочь найти потенциальные проблемы, и определенно сделайте ваши проблемы параллелизма как можно более простыми. Проблемы с общей изменяемой памятью трудны, но на самом деле довольно легко переопределить проблему, чтобы вы неподелиться изменяемым состоянием, только неизменяемым. Это делает жизнь намного проще. О, и прочитайте JCiP - затем прочитайте его снова. И пересмотрите свой код.