Единый порядок захвата блокировок (всегда сначала Lock1, потом Lock2). Избегать удержания нескольких блокировок; брать только нужную. Использовать таймауты (TryLock, select с time.After). По возможности - каналы и один владелец данных вместо нескольких мьютексов.