Если ситуация является реальной тупиковой ситуацией (то есть два потока удерживают две разные блокировки, но по крайней мере один поток хочет блокировки, которую удерживает другой поток), вам необходимо сначала отказаться от всех предварительных представлений о том, как потоки упорядочивают блокировку. Ничего не предполагать Возможно, вы захотите удалить все комментарии из кода, который вы просматриваете, поскольку эти комментарии могут заставить вас поверить в то, что не соответствует действительности. Трудно подчеркнуть это достаточно: ничего не предполагайте.
После этого определите, какие блокировки удерживаются, пока поток пытается заблокировать что-то еще. Если вы можете, убедитесь, что поток разблокируется в обратном порядке от блокировки. Более того, убедитесь, что поток удерживает только одну блокировку за раз.
Кропотливо прорабатывает выполнение потока и проверяет все события блокировки. При каждой блокировке определите, удерживает ли поток другие блокировки, и если да, то при каких обстоятельствах другой поток, выполняя аналогичный путь выполнения, может добраться до рассматриваемого события блокировки.
Вполне возможно, что вы не найдете проблемы, пока у вас не хватит времени или денег.