Все остальные ответы были направлены на то, чтобы на самом деле протестировать код, пройдя его через все шаги и фактически запустив его в той или иной форме или вежливо сказав: «Не делай это сам, используй существующую библиотеку».
Это замечательно и все, но IMO, самый важный (практические тесты тоже важны) тест, состоит в том, чтобы построчно смотреть на код, а для каждой строки кода спрашивать "что произойдет, еслибыть прерванным другим потоком здесь? "Представьте себе другой поток, выполняющий практически любые другие строки / функции во время этого прерывания.Все еще остается неизменным?Когда мы конкурируем за ресурсы, другой поток блокирует или вращает?
Это то, что мы делали в школе, когда изучали параллелизм, и это удивительно эффективный подход.В итоге, я чувствую, что потратить время на то, чтобы доказать себе, что все согласованно и работает, как ожидается, во всех штатах, - это первая техника, которую вы должны использовать при работе с этим материалом.